如何使用传入 C# 中当前方法的实现实例化接口对象
本文关键字:方法 实现 实例化 对象 接口 何使用 | 更新日期: 2023-09-27 18:36:43
给定一个简单的界面
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();
}
经过一番研究,我发现
var being = Activator.CreateInstance(idt.GetType()) as IIdTracker;
作为解决方案。
使用泛型执行此操作的更好方法是:
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; }
}
或者,如果正如您的编辑所说,您无法执行此操作,因为最终您最终会得到您尝试克隆的IIdTracker
对象的List
,那么更好的方法可能是将.Clone
方法添加到您的IIdTracker
界面中,或者创建一个新的界面IIdCloneable
以便人类或机器人各自知道如何创建自己的克隆。或者,您有一个CloneFactory
,每个类型都向克隆工厂注册自身,以便它知道如何创建任何类型之一。 克隆工厂可以像Dictionary<Type,Func<IIdTracker>>
一样简单,它存储了创造人类、机器人或其他任何东西的动作。例如 factory.Add(typeof(Human), () => new Human());