0

次のように3つのクラスがあります。

public class TestA
{
    public string Str1 { get; set; }
    public string Str2 { get; set; }
    public List<TestB> LstTestBs { get; set; }
    public TestC ObjTestC { get; set; }
}

public class TestB
{
    public string Str3 { get; set; }
    public string Str4 { get; set; }
}

public class TestC
{
    public string Str5 { get; set; }
}

私が試してみました:

var prop = typeof (TestA).GetProperties();

ただし、TestA 内の 4 つのメンバーの PropertyInfo のみを提供しています。TestA、TestB、お​​よび TestC クラスのすべてのメンバーの PropertyInfo を取得する必要があります。

助けてください...よろしくお願いします、サン

4

3 に答える 3

0

すべてのクラスを同じ名前空間に配置すると、プロパティ構造をマイニングする代わりに、名前空間でクラスを列挙することでプロパティを収集できます。

リフレクションを介して名前空間内のすべての型を取得する

于 2013-07-19T10:25:28.683 に答える
0

みんな助けてくれてありがとう。私は答えを得ました。

        var prop = typeof (TestA).GetProperties();

        for (int i=0;i<prop.Count();i++)
        {
            var propertyInfo = prop[i];
            if (propertyInfo.PropertyType.Namespace != "System")
            {
                if (propertyInfo.PropertyType.IsGenericType &&
                    propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof (List<>))
                {
                    Type itemType = propertyInfo.PropertyType.GetGenericArguments()[0]; 
                    var listObjectProperties = itemType.GetProperties();
                    prop = prop.Union(listObjectProperties).ToArray();

                }
                else
                {

                    var childProp = propertyInfo.PropertyType.GetProperties();
                    prop = prop.Union(childProp).ToArray();
                }
            }
        }
于 2013-07-19T10:20:11.920 に答える
0

SLaks そうです。これは再帰的に行う必要があります。概念の詳細については、再帰に関するウィキペディアの記事を参照してください。たとえば、あなたの場合、これは一般的な考え方です:

public void AddPropertiesAndChildPropertiesToList(Type type, List<PropertyInfo> list)
{
    var properties = type.GetProperties();
    list.AddRange(properties);
    foreach (var property in properties)
    {
        // recursive methods are ones that call themselves, like this...
        AddPropertiesAndChildPropertiesToList(property.PropertyType, list);
    }
}

この例にはいくつかの点が欠けていることに注意してください。

  • 最も重要なことは、無限再帰に対するガードがないことです。これは、パラメーターを使用して既に行っていた場所を追跡することで修正できStack<Type> alreadyVisitedます。既にアクセスした型のプロパティのリストを追加するように求められていることがわかった場合は、return代わりにメソッドの外に出すか、例外をスローしてください。
  • 他の関連する質問で述べたように、目的のためには、プロパティだけでなく、プロパティ チェーンを追跡する必要があります。ここalreadyVisitedでもスタックが役立ちます。
  • それはあなたList<TestB>を有用な方法で処理しません。そのためには、おそらく型にインデクサーがあるかどうかを把握し、次にそのインデクサーによって返される型のプロパティを把握する必要があります。
于 2013-07-19T15:24:46.593 に答える