1

私は少し混乱している atm で、何か間違ったことをしているに違いないので、これほど難しいとは思いません。過去 2 日間に私がやろうとしているのは、リストに格納されているオブジェクト内のメソッドにアクセスすることです。私の考えでは、オブジェクトを元の型に戻してメソッドを呼び出すだけでよいのですが、それはできません。

タイプ、ジェネリック、リフレクションについてたくさん読んでいますが、うまくいかないので、明らかにすべて間違っているので、光を見つけるのに助けが必要です!

Heresは私が試した最新のコードです

            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;
    }

私はこれでどこにも行けないと思うので、誰かが私を正しい方向に向けることができることを願っています:/

どんな助けやヒントも大歓迎です!!! すべての返信に賛成票が投じられます!

よろしく

4

3 に答える 3

4

ここで行う必要があることがいくつかあります。まず、投稿したコードを見てみましょう

自問する必要がある最初の質問は、リフレクションを使用する必要がありますか? 代わりにインターフェイスを使用したり、既知の型を返すことはできますか?

GetMainList(x) を制御できますか? もしそうなら、オブジェクト以外のより便利なものを返すように変更できませんか?

Object customer = Hotel.Main.Manager.GetMainList(x);

何かにキャストできますか?

第二に、ターゲット メソッドはジェネリック メソッドではないため、以下の行は機能しません。

MethodInfo generic = method.MakeGenericMethod(frsttype);

Invoke には 2 つの引数があります。最初の引数は、メソッドを呼び出す対象のオブジェクトと、それに渡すことができるパラメーターです。

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 でのリフレクションの優れたチュートリアルを以下に示します。

于 2013-03-09T10:38:06.947 に答える
3

つまり、簡単に呼び出すことができます:

 Type myType =customer.GetType();
 MethodInfo method = typeof(customer).GetMethod("GetCustomerSpecificData");
 MethodInfo generic = method.MakeGenericMethod(myType);
 var res= generic.Invoke(this, null);
于 2013-03-09T10:43:45.513 に答える
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 */

または、リスト内のさまざまなタイプの実装を変更できる場合は、インターフェイス(または代替の(抽象)基本クラス)を使用します。

/* 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のみを返すようにすることができます

于 2013-03-09T11:16:50.677 に答える