我想重构下面的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来为将来的更多类型运行相同的代码。
答案 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()