我有点困惑atm,我不认为这可能是这么难,因为那时我一定是做错了。我在过去2天尝试做的是访问存储在List中的对象内部的方法,但我无法得到它。在我看来,它应该只是让对象回到它的原始类型并调用方法,但我不能这样做。
我一直在阅读有关Type,Generics和反射的很多内容,但它无法正常工作,所以我很明白这一切都是错误的,我需要帮助寻找光明!
这是我试过的最新代码
Object customer = Hotel.Main.Manager.GetMainList(x);
Type frsttype = customer.GetType();
MethodInfo method = frsttype.GetMethod("GetCustomerSpecificData");
MethodInfo generic = method.MakeGenericMethod(frsttype);
String str = generic.Invoke(method);
我想要达到的是对象内的这个方法:
public override string GetCustomerSpecificData()
{
string strout = string.Format("{0,-5}{1,26}{2,28}{3,28}\a", ID, Name, Age, Gender);
string strInfo = Extra;
strout += (string.IsNullOrEmpty(strInfo) ? string.Empty : strInfo);
if (m_specialoffer)
{
strout += string.Format("\nSpecial Offer");
}
if (IsRegularCustomer)
{
strout += (IsDangerus ? "\nIs a regular customer " : "\nIs not a regular customer.");
}
strout += Environment.NewLine + PaymentInfo();
strout += (m_CarPark ? "\nHas car parked in garage." : "\nDoes not have car parked in garage.");
return strout;
}
我希望有人可以指出我正确的方向,因为我不认为我会得到这个:/
任何帮助和提示将不胜感激!!!所有人都会被赞成回复!
此致
答案 0 :(得分:4)
这里有一些你需要做的事情,首先让我们看看你发布的代码
第一个问题你需要问自己我是否需要使用反射,我可以使用接口或返回我知道的类型吗?
你有GetMainList(x)的控制权吗?如果不能你改变它,那么它会返回一个比对象更有用的东西吗?
Object customer = Hotel.Main.Manager.GetMainList(x);
你能投入任何东西吗?
其次,您的目标方法不是通用方法,因此下面的行不起作用。
MethodInfo generic = method.MakeGenericMethod(frsttype);
您也正在调用该方法错误您Invoke有两个参数,第一个是您希望调用该方法的目标对象以及您可以传递给它的参数。
Invoke(object obj, object[] parameters)
要调用您的方法,您需要执行以下操作。
Object customer = Hotel.Main.Manager.GetMainList(x);
Type frsttype = customer.GetType();
MethodInfo method = frsttype.GetMethod("GetCustomerSpecificData");
String str = method.Invoke(customer, null) as string;
在stackoverflow上有一些很棒的问题和社区wiki,当然在MSDN库中有很多教程和示例。
可以在下面找到一个很好的.net反思教程。
答案 1 :(得分:3)
我的意思是你可以轻松调用它:
Type myType =customer.GetType();
MethodInfo method = typeof(customer).GetMethod("GetCustomerSpecificData");
MethodInfo generic = method.MakeGenericMethod(myType);
var res= generic.Invoke(this, null);
答案 2 :(得分:2)
最接近你目前拥有的东西,这可以在不依赖反射的情况下发挥作用。
Object customer = Hotel.Main.Manager.GetMainList(x);
string result="";
var custObj = customer as Customer;
if (custObj !=null)
{
result = custObj.GetCustomerSpecificData();
}
var specialcustObj = customer as SpecialCustomer;
if (specialcustObj !=null)
{
result = specialcustObj.GetCustomerSpecificData();
}
/* etc */
或者,如果可以更改List中不同类型的实现,则可以使用接口(或替代(抽象)基类。
/* alternatively name it ISpecificData if you want adhere common used standards */
public interface SpecificData
{
string GetCustomerSpecificData();
}
以及您的客户和可以在列表中的其他类:
public class Customer:SpecificData
{
/* rest of implemementastion stays the same */
}
获取客户的代码将如下所示,并且将适用于实现该界面的列表中的每个对象。
Object customer = Hotel.Main.Manager.GetMainList(x);
string result="";
var interfaceObj = customer as SpecificData;
if (interfaceObj != null)
{
result = interfaceObj.GetCustomerSpecificData();
}
当您知道列表中只有特定接口时,您可以使用通用列表仅保存该特定类型的对象:
mainlist = new List<SpecificData>();
并且您可以调整GetMainList以仅返回接口SpecificData