0

以前のスレッドUsing Reflection read properties of an object containing array of another objectに続きます。EvgK のこの素晴らしいメソッドを、私のコード ベースの複数の場所で使用できる汎用メソッドにしたいと考えています。

public static void GetMyProperties(object obj)
{
    List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
    {

        if (!Helper.IsCustomType(pinfo.PropertyType))
        {
            //add properties - name, value, type to the list
        }
        else
        {
            var getMethod = pinfo.GetGetMethod();

            if (getMethod.ReturnType.IsArray)
            {
                var arrayObject = getMethod.Invoke(obj, null);
                foreach (object element in (Array)arrayObject)
                {
                    foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
                    {
                        //add properties - name, value, type to the list
                    }
                }
            }
            else
            {
                List<MyPropertyInfo> oTempMyProp = GetMyProperties(prop.GetValue(obj, null));
                oMyProp.AddRange(oTempMyProp);
            }
        }


    }
}

繰り返しますが、ユーザーから渡されたメソッドを読み取ろうとしています。パラメータ、そのプロパティ、および値をリストします。ユーザーが入力値を提供したら、メソッドを動的に呼び出して結果オブジェクトを取得します。結果は GetMyProperties() メソッドに渡され、メソッドはすべてのプロパティ (n レベルまで) - 名前、値、および型をリストします。

現在、2 つの方法があります (以下の定義)。

public List<MyPropertyInfo> GetMyProperties(Type type);

public List<MyPropertyInfo> GetMyProperties(object obj);

最初のものを使用して、選択したメソッドのすべてのパラメーターのリストとそのプロパティ (名前、値、および型) を表示します。

MethodInfo members = type.GetMethod(this.MethodName);
ParameterInfo[] parameters = members.GetParameters();
List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
foreach (var parameter in parameters)
{
    oMyProp = GetMyProperties(parameter.ParameterType);    
}

..ユーザーがパラメーターを入力できるように、プロパティのリストを作成します。カスタム タイプかどうかの ParameterType および GetProperties メソッド チェックに合格します。カスタムタイプの場合、入力用のグリッドにバインドするリストを作成するために、タイプを使用して再帰的に呼び出します。

2 番目のメソッド GetMyProperties(object obj) は、返されるオブジェクトを一覧表示するために使用されます。コンパイル時に選択したメソッドの戻り値の型がわからないため、オブジェクト型を使用します。2 番目のメソッドを何らかの方法で変更して、パラメーター、プロパティ、および戻り値の型を読み取るために使用できるかどうかを知りたいですか? 別々の方法を持つ代わりに?コードの再利用を試みています。

4

1 に答える 1

0

私はあなたを正しく理解しているかどうかわかりませんが、2 つのメソッドを 1 つに結合したい場合は、両方のケースでオブジェクトを渡すことができますが、オブジェクトが Type かどうかを確認し、その場合に異なるロジックを提供します。

public static void GetMyProperties(object obj)
{
   if (obj is Type)
   {
      Type type = obj as Type;
      ... here is the first method logic ...
   } 
   else 
   {
      ... here is the second method logic ...
   }
}
于 2011-02-08T06:59:44.370 に答える