方法,该方法接受要创建的对象的类型和它应该返回的接口的类型——是否可能

本文关键字:方法 类型 接口 返回 是否 创建 对象 | 更新日期: 2023-09-27 17:59:25

想象一下像这样的的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;
}

编辑-嗯,这实际上不会做你想做的,因为你试图转换到一个接口。呜呜。

我想你指的是鸭子打字,如果它看起来像鸭子,那么它就是鸭子!

你应该看看这些链接

维基百科鸭子打字
鸭子打字解释