我有一个函数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");
我可以strMessage
,staticField
而不是cantAccessThisFn
。如果我直接创建clsA
的对象,我就可以获得cantAccessThisFn
。有没有办法从obj(类QMain
的对象)访问此函数?
我收到以下错误:
'object'不包含'cantAccessThisFn'的定义,也没有扩展方法'cantAccessThisFn'接受第一个参数 可以找到类型'对象'(你是否错过了使用指令或者 装配参考?)
答案 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;
}
}