在存储对象中调用方法

时间:2013-03-09 10:10:40

标签: c# reflection

我有点困惑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;
    }

我希望有人可以指出我正确的方向,因为我不认为我会得到这个:/

任何帮助和提示将不胜感激!!!所有人都会被赞成回复!

此致

3 个答案:

答案 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