从另一个类访问条件静态类方法

时间:2017-11-15 15:00:29

标签: c# asp.net

我有静态课程ABC喜欢

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设置为类的名称。我尝试在课程AB中访问的方法具有相同的名称。但是我得到了像

这样的错误
  

类型不包含' SampleMethod'

的定义

2 个答案:

答案 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的类型为TypeType实例本身就是一个对象,因此不是AB类型。这意味着当您将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的方法。有类似的方法,但允许更通用的方法。