需要创建对象类型的方法和它应该返回的接口类型 - 是否可能?

时间:2011-06-16 20:03:02

标签: c# generics reflection

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

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

5 个答案:

答案 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)

我认为你指的是Duck Typing,如果它看起来像鸭子那么它就是鸭子!

您应该查看其中一些链接

Wikipedia Duck Typing
Duck Typing Explained