Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用传递给C#中当前方法的实现实例化接口对象?_C#_Dynamic_Interface_Instantiation_Typeof - Fatal编程技术网

如何用传递给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的方法调用此函数,您也需要在那里修复它,并使该方法也具有泛型。或者,您可以使整个类成为泛型的,然后这些方法就不需要是泛型的。