如何使用传入 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();
}

如何使用传入 C# 中当前方法的实现实例化接口对象

经过一番研究,我发现

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());