簡體   English   中英

如何使用傳入C#中當前方法的實現實例化接口對象?

[英]How to instantiate an interface object with implementation that is passed in to current method in C#?

給定一個簡單的界面

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>>這樣簡單Dictionary<Type,Func<IIdTracker>>它存儲創建人類,機器人或其他任何東西的動作。 例如factory.Add(typeof(Human), () => new Human());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM