给出一个简单的界面
public interface IIdTracker
{
int Id { get; }
}
我有两个实现它的课程
public class human : IIdTracker
{
public int Id { return 0; }
}
public class robot : IIdTracker
{
public int Id { return 1; }
}
如何在不知道实现IIdTracker的人员或内容的情况下,实例化作为IIdTracker传递的类?
public void TrackId(IIdTracker idt)
{
// this is the code I am not sure of
var being = new idt.GetType();
}
答案 0 :(得分:2)
var being = Activator.CreateInstance(idt.GetType()) as IIdTracker;
作为解决方案。
答案 1 :(得分:2)
使用泛型的更好方法是:
public void TrackId<T>(T idt)
where T:IIdTracker, new()
{
var being = new T();
}
并向您的类添加一个公共无参数构造函数,例如
public class Human : IIdTracker
{
public Human() { }
public int Id { return 0; }
}
或者,如果您的编辑说您无法执行此操作,因为最终您最终会遇到要尝试克隆的List
个IIdTracker
个对象,那么更好的方法可能是添加将.Clone
方法放入IIdTracker
界面,或创建新界面IIdCloneable
,以便人类或机器人都知道如何创建自己的克隆。或者,你有一个CloneFactory
,每个类型都与克隆工厂注册,因此它知道如何创建任何东西。克隆工厂可以像Dictionary<Type,Func<IIdTracker>>
一样简单,它存储创建人类,机器人或其他任何东西的动作。例如factory.Add(typeof(Human), () => new Human());