如何使用泛型类型的数组

时间:2013-09-25 04:46:13

标签: c# generics casting

我想重构下面的C#代码:

public static T SomeMethod<T>() where T : SomeBaseClass {}

SomeMethod<Foo>().someProperty = sameValue;
SomeMethod<Bar>().someProperty = sameValue;
SomeMethod<Baz>().someProperty = sameValue;
//...

喜欢这个:

public static T SomeMethod<T>() where T : SomeBaseClass {}

Type[] types = new Type[]{
    typeof(Foo), typeof(Bar), typeof(Baz), //...
};
foreach (Type type in types) {
  // How??
  // SomeMethod<type>().someProperty = sameValue;
}

所以我想准备类型数组并使用foreach来为将来的更多类型运行相同的代码。

3 个答案:

答案 0 :(得分:2)

如果您在编译时不知道您的类型是什么,那么使用泛型是没有意义的 重构您的代码以将方法签名更改为以下内容:

SomeMethod(Type t){/*do some stuff here*/}

并查看@Florian Gl在评论中给出的链接。

答案 1 :(得分:0)

如果你想自动获取从公共基类型继承的所有类型的列表,我会使用反射。它很简单:

var assembly = Assembly.GetAssembly(typeof(SomeBaseClass));
var types = assembly.GetTypes().Where(type => typeof(SomeBaseClass).IsAssignableFrom(type));

那就是说,你看起来像是在使用静态方法,它会在一堆不同的类型上设置静态属性。你可以使用反射,但你最好采取一种更好的方法来解决这个不依赖于全局状态的问题(这基本上就是一个静态属性)。

答案 2 :(得分:0)

如果您拥有MethodInfo,则可以通过反射调用泛型方法。

首先使用一种类型为MethodInfo的{​​{1}}调用该方法的每个泛型类型参数。

然后使用您希望调用该方法的对象的实例调用生成的MethodInfo MakeGenericMethod(params Type[] typeArguments)的{​​{1}}(如果是MethodInfo方法,则调用object Invoke(object obj, object[] parameters)),以及按顺序包含方法参数的对象数组。

这是您修改的c#代码,用于编译,运行和执行某些操作。 null是您的第一个代码段。 static执行您希望第二个代码段执行的操作。

Example1()

以下是该计划的输出:

Example2()