我有静态课程A
,B
和C
喜欢
public static class A
{
public static bool SampleMethod()
{
...
}
}
public static class B
{
public static bool SampleMethod()
{
...
}
}
public static class C
{
public static bool DoStuff(Enum dataType)
{
Type targetClass = null;
switch (dataType)
{
case DataType.1:
targetClass = typeof(A);
break;
case DataType.2:
targetClass = typeof(B);
break;
}
return targetClass.SampleMethod();
}
}
我试图将变量targetClass
设置为类的名称。我尝试在课程A
和B
中访问的方法具有相同的名称。但是我得到了像
类型不包含' SampleMethod'
的定义
答案 0 :(得分:0)
与其他评论一样,typeof运算符返回的类型是Type,而不是A或B,所以你不能调用SampleMethod。
有几种方法可以实现这一目标。最简单的方法是使用Func存储方法:
public static class C
{
public static bool DoStuff(DataType dataType)
{
Func<bool> method = null;
switch (dataType)
{
case DataType.A:
method = A.SampleMethod;
break;
case DataType.B:
method = B.SampleMethod;
break;
}
return method();
}
}
另一种方法是让A,B实现一个通用接口
答案 1 :(得分:0)
正如您在此行Type targetClass = null;
中看到的那样,targetClass的类型为Type
。 Type
实例本身就是一个对象,因此不是A
或B
类型。这意味着当您将targetClass
设置为值typeof(A)
时,您不会创建A
的实例(即使A
不是静态的,您也不会),而是将targetObject
设置为Type
类型的值。此值是一个对象,其中包含有关静态类A
的元信息。
你想要做的事情可以通过几种方式来实现。
我能想象到的最简单的方法是使用在枚举上编制索引的字典并存储Action<bool>
类型的值,如下所示:
public static class C
{
private static Dictionary<TypeEnum, Func<bool> dic = new Dictionary<TypeEnum, Func<bool>() {
{ DataType.1, A.SampleMethod },
{ DataType.2, B.SampleMethod }
}
public static bool DoStuff(Enum dataType)
{
return dic[dataType].Invoke();
}
}
这种方法是有限的,因为它只允许返回类型为bool
的方法。有类似的方法,但允许更通用的方法。