Open snikeguo opened 4 years ago
我的简单实现。已经测试可以用
using System;
using System.Reflection;
using System.Threading.Tasks;
namespace ConsoleApp1
{
interface IMyInterFace
{
Task HelloWorld(string s);
}
class MyInterFaceImpl : ServerInfo,IMyInterFace
{
public Task HelloWorld(string s)
{
Console.WriteLine($"Hello World!{s}");
return Task.CompletedTask;
}
}
class ServerInfo
{
public string Ipv4 { get; set; } = "127.0.0.1";
}
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.GetExecutingAssembly();
var v = assembly.GetTypes();
//假设到这里 已经知道了要创建那个类型的对象了,
Type MyInterFaceImplType = assembly.GetType("ConsoleApp1.MyInterFaceImpl");//获取要创建对象的类型
Object MyInterFaceImplInstance = assembly.CreateInstance(MyInterFaceImplType.FullName);//创建对象
((ServerInfo)(MyInterFaceImplInstance)).Ipv4 = "666";//这里把链接信息赋给创建好的对象
var needcallmi = MyInterFaceImplType.GetMethod("HelloWorld");//获取需要调用的mathodInfo
needcallmi.Invoke(MyInterFaceImplInstance, new object[] { "123" });//call
}
}
}
这个主要看控制器的实例模式吧,如果每次调用都实例化这种设计是可行,如果是单实例则不好用了。
单实例的话,就不用创建对象了,找到最前面第一次创建的对象,更新当前的连接信息即可。 顺便说一句,用户如果继承连接信息类的话,就赋值当前连接信息操作,如果用户没继承连接信息类,只是继承了IMyInterface(底层实现强转成父类,肯定是null),就不操作,说明用户不需要连接信息。
单实例是所有用户共享实例,无法直接更新,这样会存在线程安全问题。
那就单例模式下不允许这么做。实例模式下才允许
现有的是通过唯一的静态属性
XRPCServer.EventToken
去获取当前的连接信息的。不够优雅~~ 我有个思路,你看下: