如何用传递给C#中当前方法的实现实例化接口对象?
给出了一个简单的接口如何用传递给C#中当前方法的实现实例化接口对象?,c#,dynamic,interface,instantiation,typeof,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传递的任何类,而不知道是谁或什么实现了I
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;
作为解决方案。经过一些研究,我发现
var being = Activator.CreateInstance(idt.GetType()) as IIdTracker;
作为解决方案。使用泛型更好的方法是:
public void TrackId<T>(T idt)
where T:IIdTracker, new()
{
var being = new T();
}
或者,如果,正如编辑所说,您不能这样做,因为最终您会得到一个
列表
,其中包含您试图克隆的IIdTracker
对象,那么更好的方法可能是在IIdTracker
界面中添加一个.clone
方法,或者创建一个新的界面iidclonable
,这样人类或机器人都知道如何创建自己的克隆。或者,您有一个克隆工厂
,每个类型都向克隆工厂注册自己,这样它就知道如何创建任何类型的克隆工厂。克隆工厂可以像一本<代码>字典一样简单,它存储了创造人类、机器人或其他东西的动作。e、 g.factory.Add(typeof(Human),()=>newhuman())代码>使用泛型执行此操作的更好方法是:
public void TrackId<T>(T idt)
where T:IIdTracker, new()
{
var being = new T();
}
或者,如果,正如编辑所说,您不能这样做,因为最终您会得到一个列表
,其中包含您试图克隆的IIdTracker
对象,那么更好的方法可能是在IIdTracker
界面中添加一个.clone
方法,或者创建一个新的界面iidclonable
,这样人类或机器人都知道如何创建自己的克隆。或者,您有一个克隆工厂
,每个类型都向克隆工厂注册自己,这样它就知道如何创建任何类型的克隆工厂。克隆工厂可以像一本<代码>字典
一样简单,它存储了创造人类、机器人或其他东西的动作。e、 g.factory.Add(typeof(Human),()=>newhuman())代码>您需要一个新的IIdTracker实例吗?您在idt
中已经有一个实例。是的,我想要单独的IIdTracker,但我想要传入的类型。您可以创建一个带有反射的新实例(或通过新的泛型约束),但是否希望它返回相同的Id值?是否需要IIdTracker
的新实例?您在idt
中已经有一个实例。是的,我想要单独的IIdTracker,但我想要传入的类型。您可能可以使用反射(或通过新的泛型约束)创建一个新实例,但你想让它返回相同的Id值吗?为了让它工作,编译器告诉我我的IIdTracker必须有无参数构造函数。但它是接口。。。这只适用于抽象类吗?@publicst119泛型约束要求T
既是一个实现IIdTracker
的类,又有一个无参数构造函数(这是方法定义中的new()
约束)。无论是您的方法还是此方法都不会创建“IIdTracker
”的实例,它们都会创建一个类的实例,该类实现了IIdTracker
@publicst119。我根据Preston的注释添加了一些代码,说明您需要做什么。我知道我们的解决方案都不会创建IIdTracker
的实例。这很好。但是,当我使用where T:IIdTracker进行约束时,new()
我的编译器在调用TrackId
的位置抛出错误,指出idt
必须具有无参数构造函数。接口的实现确实有无参数构造函数,但它超出了此项目知识的范围。@publicst119是的,泛型将通过您的解决方案传播出去,如果您是从另一个使用IIdTracker的方法调用此函数,您也需要在那里修复它,并使该方法也具有泛型。或者你可以使整个类成为泛型的,然后方法就不需要是泛型的。为了让它工作,编译器告诉我,我的IIdTracker必须有无参数构造函数。但它是接口。。。这只适用于抽象类吗?@publicst119泛型约束要求T
既是一个实现IIdTracker
的类,又有一个无参数构造函数(这是方法定义中的new()
约束)。无论是您的方法还是此方法都不会创建“IIdTracker
”的实例,它们都会创建一个类的实例,该类实现了IIdTracker
@publicst119。我根据Preston的注释添加了一些代码,说明您需要做什么。我知道我们的解决方案都不会创建IIdTracker
的实例。这很好。但是,当我使用where T:IIdTracker进行约束时,new()
我的编译器在调用TrackId
的位置抛出错误,指出idt
必须具有无参数构造函数。接口的实现确实有无参数构造函数,但它超出了此项目知识的范围。@publicst119是的,泛型将通过您的解决方案传播出去,如果您是从另一个使用IIdTracker的方法调用此函数,您也需要在那里修复它,并使该方法也具有泛型。或者,您可以使整个类成为泛型的,然后这些方法就不需要是泛型的。