想象一下像这样的C#代码
ISomeInterface someVar = creator.Create(typeof(SomeClass),
typeof(ISomeInterface));
应该怎么办?方法creator.Create有两个参数:第一个是要创建的对象的类型,第二个是方法应该将新创建的对象强制转换为该类型并返回的类型。
所以,就像在示例代码中一样:我们想要使用我们知道类实现的接口,所以我们要求创建对象并指定返回的类型应该是我们感兴趣的接口。
甚至有可能以某种方式实现它吗?基于一些复杂的泛型声明的泛型,反射,动态方法创建?更复杂的东西?我愿意接受建议。
当然,我们没有考虑将最终值返回到ISomeInterface的最简单的解决方案。方法应该将创建的对象作为我们要求的接口返回。
如果你想知道我需要什么,因为我试图使我的工作代码复杂化,徒劳地追求一些简化我的班级工厂的聪明方法:)
修改:
当前通用方法创建:
public T Create<T>(Type type)
{
return (T)Activator.CreateInstance(type);
}
但这不是我想要的,它提供两种类型,基本上创建第一个对象但返回第二个。对于在我的代码库中实现的不同接口,我不具备Create方法。
进一步的使用示例:
IFoo f = Create(typeof(Foo), typeof(IFoo));
IBar b = Create(typeof(Bar), typeof(IBar));
因此,您可以看到方法每次根据第二个参数中提供的类型返回不同的接口。并且没有办法使用类型约束,或者我不知道如何去做。
答案 0 :(得分:2)
在我的头顶,你可以做这样的事情:
public I Create<T, I>() where T : I { if(typeof(I).IsInterface) { return Activator.CreateInstance<T>(); } /* Handle non-interface I calls with exception, etc */ }
答案 1 :(得分:1)
如果您希望Create()
方法在不必明确强制转换的情况下返回ISomeInterface
,那么您显然需要将其设为Create<ISomeInterface>()
。
要动态构造传递类型和实例,您显然需要使用反射,但Activator
会使其更容易。
答案 2 :(得分:0)
这似乎不是一件非常安全的事情。
public TResult CreateToType<TType,TResult>() where TType : new() where TResult : class
{
return new TType() as TResult;
}
编辑 - 嗯这实际上不会做你想要的,因为你试图转换为界面。 Woops。
答案 3 :(得分:0)
您可以使用通用type constraints:
public T Create<T,U,V> (U var1, V var2)
where T: ISomeInterface
where U: SomeClass
where V: ISomeInterface
{
//Some code
}
答案 4 :(得分:0)