C# 方法,该方法接受要创建的对象的类型及其应返回的接口的类型-是否可能?

C# 方法,该方法接受要创建的对象的类型及其应返回的接口的类型-是否可能?,c#,generics,reflection,C#,Generics,Reflection,想象一下这样的C代码 ISomeInterface someVar = creator.Create(typeof(SomeClass), typeof(ISomeInterface)); 该怎么办?Create接受两个参数:第一个是要创建的对象的类型,第二个是方法应该将新创建的对象强制转换为并作为该类型返回的类型 所以,就像在示例代码中一样:我们希望使用我们知道的类实现的接口,所以我们要求创建对象,并指定返回的

想象一下这样的C代码

ISomeInterface someVar = creator.Create(typeof(SomeClass), 
                                        typeof(ISomeInterface));
该怎么办?Create接受两个参数:第一个是要创建的对象的类型,第二个是方法应该将新创建的对象强制转换为并作为该类型返回的类型

所以,就像在示例代码中一样:我们希望使用我们知道的类实现的接口,所以我们要求创建对象,并指定返回的类型应该是我们感兴趣的接口

甚至有可能以某种方式实现它吗?泛型、反射、基于复杂泛型声明的动态方法创建?更复杂的东西?我愿意听取建议

当然,我们并没有考虑最简单的解决方案,即显式地将返回值转换为接口。方法应将创建的对象作为我们要求的接口返回

如果您想知道我需要它做什么,因为我正在尝试将我的工作代码复杂化,徒劳无功地追求一些简化我的类工厂的聪明方法:)

编辑

当前通用方法创建:

public T Create<T>(Type type)
{
   return (T)Activator.CreateInstance(type);
}

所以,正如您所看到的,方法每次根据第二个参数中提供的类型返回不同的接口。而且没有办法使用类型约束,或者我不知道怎么做。

这似乎不是一件非常安全的事情

public TResult CreateToType<TType,TResult>() where TType : new() where TResult : class
{
    return new TType() as TResult;
}
public TResult CreateToType()其中TType:new()其中TResult:class
{
返回新的TType()作为TResult;
}

编辑-嗯,这实际上不会做你想做的事情,因为你试图转换到一个界面。Woops.

如果希望
Create()
方法返回
isomoInterface
,而不必显式强制转换,那么显然需要使其
Create()

要动态构造传递类型的实例,显然需要使用反射,尽管
Activator
会使其更容易。

您可以使用泛型:

public T创建(U var1,V var2)
式中T:Isome接口
你在哪里:什么课
式中V:等距接口
{ 
//一些代码
}

我想你指的是Duck类型,如果它看起来像Duck,那么它就是Duck

您应该查看其中的一些链接



在我的头顶上,你可以做这样的事情:

public I Create<T, I>() where T : I { if(typeof(I).IsInterface) { return Activator.CreateInstance<T>(); } /* Handle non-interface I calls with exception, etc */ } public I Create(),其中T:I{ if(I.I.接口的类型){ 返回Activator.CreateInstance(); } /*处理异常情况下的非接口I调用等*/ }
请注意,将对象强制转换到接口时,不会得到两个不同的对象,接口只是查看对象的不同方式。换句话说,由于您的方法不是泛型的,因此无论如何它都必须返回
对象
,因此您最好在方法之外执行强制转换。这就是我所担心的,但是如果没有其他方法……您能解释一下此方法的用途吗?我无法理解为什么要创建类型为
a
的对象,但将其作为类型
B
返回。如果方法返回值的接收者是
B
类型,但想调用
a
类型的方法,那么无论如何,您只需将其转换回
a
。给出您的用法示例,下面是我感到困惑的原因:
IFoo f=Create(typeof(Foo),typeof(IFoo))之间有什么区别
ifoof=newfoo()?在这两种情况下,f都将被分配一个Foo实例,该实例将被视为IFoo。我希望删除直接对象创建,并将其完全移动到类工厂中。要创建的类型不会像我的示例中那样直接传递,而是隐藏在枚举或类似的东西后面。我知道类型约束,但不幸的是,这不是我想要的,这一定是我见过的最不通用的方法。将U约束为特定的具体类型有什么用您可以发送从someclasses派生的类,因此第二个参数仅用于声明您要强制转换到的类型?@Yochai:是的,第二个参数仅指定已创建对象强制转换到的返回类型。当然,我可以使用Create(typeof(SomeClass)),但我希望不再需要显式part哦,我从来没有听说过,这是一个有趣的概念,也许duck可以救我:)但现在我还没有找到一种方法返回所请求的接口。需要更仔细地阅读,这就是它现在的工作原理,但我希望摆脱接口类型的显式传递。我接受这个答案,但因为它最接近实际可能的解决方案,但真正的答案是,这种方法不可能与今天的C#文法一起使用
public T Create<T,U,V> (U var1, V var2) 
where T: ISomeInterface 
where U: SomeClass
where V: ISomeInterface
{ 
 //Some code
}
public I Create<T, I>() where T : I { if(typeof(I).IsInterface) { return Activator.CreateInstance<T>(); } /* Handle non-interface I calls with exception, etc */ }