0

私は現在、ネストされたエンティティ(エンティティフレームワーク)を使用するように適応しているこのコードを持っています。2 つの子エンティティである 2 つのプロパティを含むエンティティがあります。

最初のステップは、両方のクラスのメタデータを読み取り、最初のクラスから始めて、プロパティのリストを作成することでした。これで完成です。次に、オブジェクトを繰り返し処理して、DataBinding を実行するための適切なプロパティを見つける必要があります。

これは私が現在持っているものです:

変数の例:

datasource = namespace.A
propriete = {System.Nullable`1[System.Int32] count} 
propriete.DeclaringType {Name = "prop2" FullName = "Namespace.Metadata.prop2"}

コード:

if (this.datasource != null)
{
    var y = (T)this.datasource;

    var propList = typeof(T).GetProperties();
    if (propList.ToList().Contains(propriete))
    {
        TextBox.Text = DataBinder.Eval(y, propriete.Name).ToString();
    }
    else
    {
        TextBox.Text = ":( need child-support!";
    }
}

私の主な問題は、オブジェクトの型が実行時 (Type T) まで不明であるため、自分のフィールドを見つける方法がわからないことです。

クイックモデル:

Class A {
  public B prop1;
  public C prop2;
}

Class B {
   int count;
   string name;
}

Class C {
   int count;
   string name;
}

A.prop1.count = 1;
A.prop1.name = "a";
A.prop2.count = 2;
A.prop2.name = "b";

現在、私のプロパティ名はすべて一意 (カウント/名前よりも具体的) ですが、ある時点でそれらが同じ (カウント/名前) になることを期待しています。

固有のものは、おそらく DeclaringType/ReflectedType で一意でない名前を「フィルタリング」する必要があります。

一意の名前を考慮したブルート フォース ソリューションは、エレガントではありませんが、受け入れられる可能性があります。

余分な問題:メインクラスを使用しながら、名前空間proprieteに含まれる別の部分クラスを使用します。metadatadatasource

(...そして、このシステムが何をするかについて興味がある場合:このmetadata.entity dataAttributeに基づくエンティティに基づいて、(.netコントロールを使用して)htmlテーブルを構築します。)

4

2 に答える 2

0

インスタンスでGetType()を呼び出すことにより、型情報を取得できます。したがって、あなたの場合は次のようになります。

var propList = this.datasource.GetType().GetProperties()
于 2012-11-21T22:53:25.597 に答える
0

これが私が最終的に得たものです:

if (this.datasource != null)
{
    var y = (T)this.datasource;

    var propList = typeof(T).GetProperties();
    //try to assign the prop but it might be on a child-prop.
    try 
    {           
        retour = DataBinder.Eval(y, propriete.Name).ToString();
    }
    catch 
    {
        foreach (PropertyInfo prop in propList)
        {
            if ((prop.PropertyType).FullName.Contains("Env."))
            {
                var childPropList = prop.PropertyType.GetProperties();
                foreach (PropertyInfo childProp in childPropList)
                {
                    if (((System.Reflection.MemberInfo)(childProp)).Name == propriete.Name)
                    {
                        var x = DataBinder.GetPropertyValue(y, prop.Name);
                        retour = DataBinder.Eval(x, propriete.Name).ToString();
                    }
                }
            }
        }
    }
}

今のところ機能していますが、近い将来には十分な汎用性がなくなる可能性があります。

于 2012-11-22T22:15:25.283 に答える