2

次のタイプが与えられます:

class Parent { List<Child> Children {get;set;}}
class Child {List<Child> GrandChildren {get;set;}}

class Helper<TEntity> {List<string> Properties {get;set;}}

そして、ヘルパーで次のメソッドが与えられます...

public Helper AddProps<TEntity, TProp>(Expression<Func<TEntity, TProp>> exp)
{
     this.Properties.Add(GetPropInfo(exp).Name);
}

public PropertyInfo GetPropInfo(Expression<Func<TEntity, TProp>> exp)
{
     return (PropertyInfo)((MemberExpression)(expression.Body)).Member;
}

私はこれを行うことができます:

Helper<Parent> myHelper = new Helper<Parent>();
myHelper.AddProps(x => x.Children);

myHelperの文字列リスト"Properties"には、式を介して渡されるプロパティの名前である値"Children"が含まれます。

私が今やりたいのは、タイプ階層を反映する機能だけで、同じことを達成できるようにすることです。

このようになりますか?

x => x.Children { xx => xx.GrandChildren }

それともそれは可能であり、何が関係するのでしょうか?以前にネストされたラムダを見たことがありますが、何が関係しているのかわかりません。

前もって感謝します!

編集

少し混乱しているようですので、はっきりさせておきます。ラムダ式とメソッドチェーンを使用して、この「Object.SubObject.SubSubObject」のような文字列を作成できるようにしたいと思います。私の例ではこれを行っていますが、1レベルの深さ(クラスのプロパティ)のみです。私がやりたいのは、これを拡張して任意の深さまで拡張することです。

たとえば、次のような流暢なインターフェイスでラムダ式を使用したいと思います。

AddProps(x => x.Children).AddProps(xx => xx.GrandChildren)を実行すると、「プロパティ」文字列リストに「Children.GrandChildren」が追加されます。

4

2 に答える 2

2

ヘルパー クラス全体ではなく、AddProps メソッドがジェネリックであると、作業が簡単になる場合があります。

このようにして、次のコードを作成できます。

var helper = new Helper();
helper.AddProps<Parent>(x => x.Children);
helper.AddProps<Child>(x => x.GrandChildren);

プロパティがどのタイプに属しているかがわかるように、プロパティ名だけでなく、それ以上のものを保持したい場合もあります。登録した各タイプのプロパティを格納する Dictionary を使用できると思います。

PSなぜこれをしたいのかを知ることは、SOコミュニティがあなたの質問によりよく答えるのに役立つかもしれません.

于 2009-09-12T17:38:23.293 に答える
0

私は非常にうまく機能する代替ソリューションを使用することになりました。この新しいクラスを使用しています...

public class PartBuilder
{
    private List<string> Parts;

    /// <summary>
    /// Gets a dot delimited string representing the parts
    /// </summary>
    public string Value
    {
        get
        {
            return string.Join(".", this.Parts.ToArray());
        }
    }

    /// <summary>
    /// Creates a new PartBuilder
    /// </summary>
    private PartBuilder()
    {
        this.Parts = new List<string>();
    }


    /// <summary>
    /// Creates a new PartBuilder
    /// </summary>
    public static PartBuilder Create()
    {
        return new PartBuilder();
    }


    /// <summary>
    /// Gets a property name from an expression
    /// </summary>
    public PartBuilder AddPart<TEntity, TProp>(Expression<Func<TEntity, TProp>> expression)
    {
        PropertyInfo prop = (PropertyInfo)((MemberExpression)(expression.Body)).Member;
        this.Parts.Add(prop.Name);

        return this;
    }
}

この新しいクラスができたので、これを行うことができます...

string typeHierarchy = PartBuilder.Create()
                         .AddPart((Parent p) => p.Children)
                         .AddPart((Child pp) => pp.GrandChildren)
                         .Value;

変数「typeHierarchy」の値が「Children.GrandChildren」になりました。

思ったほどエレガントではありませんが、タイプセーフで使いやすいです。

于 2009-09-13T07:47:59.930 に答える