C#-根据泛型类中提供的接口实例化类

C#-根据泛型类中提供的接口实例化类,c#,generics,instantiation,C#,Generics,Instantiation,我有一个泛型函数,它将接口作为一个类型,现在在一个条件下,我必须根据接口创建一个新类。我一直在考虑这个问题,解决这个问题的一个方法是使用国际奥委会,但我希望有另一种方法,因为国际奥委会似乎有点过头了 下面是使用访问者模式的尝试: public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new() { public T GetOrCreate(string id)

我有一个泛型函数,它将接口作为一个类型,现在在一个条件下,我必须根据接口创建一个新类。我一直在考虑这个问题,解决这个问题的一个方法是使用国际奥委会,但我希望有另一种方法,因为国际奥委会似乎有点过头了

下面是使用访问者模式的尝试:

public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new()
{
    public T GetOrCreate(string id)
    {
        T item = (T)CreateNew(new T(), id);
        return item;
    }
}
public类RepositoryManager:IRepositoryManager其中T:class,new()
{
公共T GetOrCreate(字符串id)
{
T item=(T)CreateNew(new T(),id);
退货项目;
}
}
如果我得到的不是一个接口,而是一个对象,那么我可以使用访问者模式来确定实例化哪个类,但我似乎无法根据提供的接口来确定这一点

我的另一个想法是,我是否可以像or一样进行where声明

public class RepositoryManager<T> : IRepositoryManager<T> where T : class, Iabc or Ixyz, new()
公共类RepositoryManager:IRepositoryManager,其中T:class、Iabc或Ixyz、new()
我希望问题很清楚:)

-标记


谢谢你的回复

问题在于,该方法可以分配许多不同的接口,例如:

RepositoryManager类:

private static IMedicament CreateNew(IMedicament emptyType, string id)
{
    return new Medicament { Id = id };
}
private static IRefund CreateNew(IRefund emptyType, string id)
{
    return new Refund { Id = id };
}

RepositoryManager<Iabc> abcRepository = new RepositoryManager<Iabc>();
RepositoryManager<Ixyz> xyzRepository = new RepositoryManager<Ixyz>();

Iabc abc = abcRepository.GetOrCreate("12345");
Ixyz xyz = xyzRepository.GetOrCreate("12345");
private静态IMedicament CreateNew(IMedicament emptyType,字符串id)
{
返回新药物{Id=Id};
}
私有静态IRefund CreateNew(IRefund emptyType,字符串id)
{
返回新退款{Id=Id};
}
RepositoryManager abcRepository=新的RepositoryManager();
RepositoryManager xyzRepository=新建RepositoryManager();
Iabc abc=abcRepository.GetOrCreate(“12345”);
Ixyz xyz=xyzRepository.GetOrCreate(“12345”);
所以使用
T item=(T)CreateNew(newt(),id)
不起作用,因为我必须告诉它t可以是Iabc或Ixyz类型,但当我这样做时,我会得到以下错误:

以下方法或属性之间的调用不明确:
RepositoryManager.CreateNew(IMedicament,string)
RepositoryManager.CreateNew(IRefund,string)


除了多次复制代码之外,如果我能让它正常工作,那就太好了。

如果我理解你的问题,基本上你想做(从某种意义上说)RhinoMocks做的事情,除了RhinoMocks实际上是从一个接口动态创建一个类,而你想使用一个现有的类

我对RhinoMocks的代码不太熟悉,不知道它是如何实现的,但由于它是开源的,您可能会从它的源代码中得到一些想法


前几天我自己也遇到了这个问题。问题是你不知道构造函数需要多少参数。假设不需要,下面的代码可以工作

public void Method<T>()
{
  Type type = typeof(T);

  T newObject = (T)type.GetConstructor(new System.Type[] { }).Invoke(new object[] { });
}
public void方法()
{
类型=类型(T);
T newObject=(T)type.GetConstructor(新系统.type[]{}).Invoke(新对象[]{});
}

该示例使用反射。如果您需要参数,那么您可以将对象放入代码中创建的数组中。

为什么这不起作用

public class RepositoryManager<T> : IRepositoryManager<T> where T : Ixyz, new()
{
    public T GetOrCreate(string id)
    {
        T item = (T)CreateNew(new T(), id);
        return item;
    }
}
公共类RepositoryManager:IRepositoryManager,其中T:Ixyz,new() { 公共T GetOrCreate(字符串id) { T item=(T)CreateNew(newt(),id); 退货项目; } } 如果不能使用new(),另一种方法是传入委托以创建对象(或兼容类型):

公共类RepositoryManager:IRepositoryManager,其中T:Ixyz
{
专用函数构造函数;
公共仓库经理(职能建造师)
{
这.\u t构造函数=t构造函数;
}
公共T GetOrCreate(字符串id)
{
T item=(T)CreateNew(this.\u tConstructor(),id);
退货项目;
}
}

我不确定我是否完全理解了这个问题,但我以前用过类似的方法

public class Repository
{
    public T Create<T>(string id) where T : class
    {
        return Activator.CreateInstance(typeof(T), new[] { id }) as T;
    }
}
公共类存储库
{
公共T创建(字符串id),其中T:class
{
将Activator.CreateInstance(typeof(T),new[]{id})返回为T;
}
}

让IRefund和IMedicament实现一个都具有Id属性的共享接口怎么样

也许下面这些对你有用? 1) 创建一个字典,其中type是接口(T参数),object是可以创建的对象的虚拟实例, 2) 让虚拟对象成为实现T的新对象的工厂


您的RepositoryManager只需要使用支持的接口对象对初始化字典,多个接口可以映射到同一个对象(如果需要)。

我不明白您的问题是什么。你想干什么?编写一个将接口作为类型(参数?)的方法,并构造一个实现该接口的类?(那要么需要一个注册表,要么需要一个反射搜索。)或者别的什么?我也不明白你想做什么。我不太确定泛型是解决这个问题的方法。
public class Repository
{
    public T Create<T>(string id) where T : class
    {
        return Activator.CreateInstance(typeof(T), new[] { id }) as T;
    }
}