无法通过dll访问公共方法

时间:2015-11-16 08:37:30

标签: c#

我有一个函数QMain(),其返回类型为object

public class QMain
{
    public object objQ(string str)
    {
        if (str.ToUpper() == "A")
        {
            clsA objA = new clsA();
            return objA;
        }
        else if (str.ToUpper() == "B")
        {
            clsB objB = new clsB();
            return objB;
        }
        else
            return "";
    }

}

以下是clsA

public class clsA 
{
   public string strMessage { get; private set; }
   public static string staticField;
   public bool cantAccessThisFn(string str)
   {...}
}

上述两个类都在同一个项目中,这是一个类库。我创建了另一个控制台应用程序,其中包含了上面的项目dll。现在,我正在做:

QMain obj=new QMain();
object A=obj.objQ("A");

我可以strMessagestaticField而不是cantAccessThisFn。如果我直接创建clsA的对象,我就可以获得cantAccessThisFn。有没有办法从obj(类QMain的对象)访问此函数? 我收到以下错误:

  

'object'不包含'cantAccessThisFn'的定义,也没有扩展方法'cantAccessThisFn'接受第一个参数   可以找到类型'对象'(你是否错过了使用指令或者   装配参考?)

2 个答案:

答案 0 :(得分:5)

问题是您的objQ方法返回object。您尚未在object上定义任何(扩展程序)方法,因此无法访问cantAccessThisFn

您应该做的是:创建一个包含您要在两个类之间共享的所有方法的界面,并且不要返回object,但返回IYourInterfaceName。然后,您可以访问界面上定义的那些方法和属性。

这样的事情:

public class clsA : IYourInterface
{
    ...
}

public interface IYourInterface
{
    string strMessage { get; }
    bool cantAccessThisFn(string str);
}

然后你的方法应该是这样的:

public IYourInterface objQ(string str)
{ ... }

你的作业是这样的:

IYourInterface a = obj.objQ("A");

现在调用它是有效的:

a.cantAccessThisFn("z");

答案 1 :(得分:1)

这是为了帮助您理解!并且不是推荐的解决方案。

Marked Patricks回答,因为这是更正确的方式......  但为了实现你的目标,你可以做类似的事情。

我还为类,属性和局部变量应用了标准的命名camel案例。

这也允许ClsA和ClsB具有完全不同的方法/属性名称。 我再次建议不要这样做,而是要帮助理解它发生了什么。

public class Program
{
    static void Main()
    {

        QMain obj = new QMain();
        object a = obj.objQ("A");

        //FYI the below commended out is not possible...
        //ClsA.staticField is but that is not the instance you created.
        //------------
        //a.staticField //<--- not possible
        //------------

        var someA = a as ClsA; //<--- attempts to cast it as ClsA
        var someB = a as ClsB; //<--- attempts to cast it as ClsB
        if (someA != null) //check if the cast was successful
        {
            var var1 = someA.StrMessage;
        }
        else if (someB != null)
        {
            //...
        }
    }
}

public class QMain
{
    public object objQ(string str)
    {
        if (str.ToUpper() == "A")
        {
            ClsA objA = new ClsA();
            return objA;
        }
        else if (str.ToUpper() == "B")
        {
            ClsB objB = new ClsB();
            return objB;
        }
        else
            return "";
    }

}

public class ClsA
{
    public string StrMessage { get; private set; }
    public static string StaticField;
    public bool CantAccessThisFn(string str)
    {
        return true;
    }
}

public class ClsB
{
    public string StrMessageMyC { get; private set; }
    public static string StaticFieldMyC;
    public bool CantAccessThisFnMyC(string str)
    {
        return true;
    }
}