想象一下像这样的的C#代码
ISomeInterface someVar = creator.Create(typeof(SomeClass),
typeof(ISomeInterface));
该怎么办?方法创建者。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));
所以,正如您所看到的,该方法每次都会根据第二个参数中提供的类型返回不同的接口。没有办法使用类型约束,或者我不知道该怎么做。
在我的脑海中,你可以做这样的事情:
public I创建<T、 我>()其中T:I{if(typeof(I).IsInterface){return Activator.CreateInstance<T>();}/*处理异常的非接口I调用等*/}
如果您希望Create()
方法返回ISomeInterface
而不必显式强制转换,那么您显然需要将其设置为Create<ISomeInterface>()
。
要动态构造传递类型的实例,显然需要使用反射,尽管Activator
会使其更容易。
您可以使用泛型类型约束:
public T Create<T,U,V> (U var1, V var2)
where T: ISomeInterface
where U: SomeClass
where V: ISomeInterface
{
//Some code
}
这似乎不是一件非常安全的事情。
public TResult CreateToType<TType,TResult>() where TType : new() where TResult : class
{
return new TType() as TResult;
}
编辑-嗯,这实际上不会做你想做的,因为你试图转换到一个接口。呜呜。
我想你指的是鸭子打字,如果它看起来像鸭子,那么它就是鸭子!
你应该看看这些链接
维基百科鸭子打字
鸭子打字解释