1

必要な情報を取得する必要がある場合は、 afieldまたはproperties values/ names

を使用しないとどうすればできますSystem.Reflectionか?

public class anyClass
{
    public const string UserID  = "usrID",
                        UserName = "usrName";
}

の使用を避けることができるかどうかを本当に知りたかったのでreflection

私は少し調査を行いました..私の使命の正しい用語は

イントロスペクション を入力します(専用タグはここでは存在しませんSO)

Introspectionと混同しないでくださいreflection

これはさらに一歩進んで、プログラムが値を操作する機能です。

メタデータ、propertiesおよび/または実行時functionsobject

システム リフレクションを使用すると、次のコード例のようにFields-にアクセスできます。values

    var ac = new anyClass();
    public List<string> anyClassFieldsValuesList()
    {
      // sorry this was the one for the class above
      return typeof(anyClass).GetFields()
                     .Select(f =>f.GetValue(ac).ToString()).ToList<string>();


     // this would do for nested class
     // return typeof(anyClass).GetNestedTypes()
                    .First(t => String.Compare(t.Name, "anyNested", true) == 0)
                    .GetFields()
                    .Select(f => f.GetValue(ac).ToString())
                    .ToList<string>();
    }

.net は、より安価な方法でその情報を取得するためのツールまたはその他のアプローチの使用法を提供してくれますか?

4

2 に答える 2

2

コストが高いことに重点を置いているということは、パフォーマンスが主な関心事であることを示唆しています。その場合、メタデータのキャッシュとメタプログラミングによって、リフレクションのオーバーヘッドを取り除くライブラリが存在します。しかし、多くの場合、その意図は非常に具体的です。

たとえば、FastMemberは、存在するメンバーを把握し、それらの値へのアクセスを許可するのに役立ちます (リフレクションの通常の関連するオーバーヘッドなしで)。ただしGetNestedTypes、少しは役に立ちません。

たとえば、ac実際の内容に基づいて、特定のオブジェクトからすべての値を取得するに:

// requires FastMember
var accessor = TypeAccessor.Create(ac.GetType());
var values = accessor.GetMembers()
        .Select(member => accessor[ac, member.Name]).ToList();
于 2012-12-13T09:30:42.417 に答える
0

動的タイプが必要なようです

于 2012-12-13T09:29:36.643 に答える