[英]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.