如何使用在C#中传递给当前方法的实现来实例化接口对象?

时间:2016-02-29 23:30:24

标签: c# dynamic interface instantiation typeof

给出一个简单的界面

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

2 个答案:

答案 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; }
}

或者,如果您的编辑说您无法执行此操作,因为最终您最终会遇到要尝试克隆的ListIIdTracker个对象,那么更好的方法可能是添加将.Clone方法放入IIdTracker界面,或创建新界面IIdCloneable,以便人类或机器人都知道如何创建自己的克隆。或者,你有一个CloneFactory,每个类型都与克隆工厂注册,因此它知道如何创建任何东西。克隆工厂可以像Dictionary<Type,Func<IIdTracker>>一样简单,它存储创建人类,机器人或其他任何东西的动作。例如factory.Add(typeof(Human), () => new Human());