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;
}
}