8

私は C# でのリフレクションについて少し調べていて、キーと値を持つディクショナリを使用して、ディクショナリ内の各キーの名前とその値を持つ変数を持つオブジェクトを作成できるかどうかを知りたいです ,その辞書のキー値。

辞書からオブジェクトを抽出する逆のメソッドがあります。この辞書には、キーとクラス プロパティ、およびそれらの値、プロパティの値が含まれています。

可能であればどのようにすればよいか考えています。

以下は、オブジェクトの辞書を抽出する私の方法です。

protected Dictionary<String, String> getObjectProperty(object objeto)
{
    Dictionary<String, String> dictionary = new Dictionary<String, String>();

    Type type = objeto.GetType();
    FieldInfo[] field = type.GetFields();
    PropertyInfo[] myPropertyInfo = type.GetProperties();

    String value = null;

    foreach (var propertyInfo in myPropertyInfo)
    {
        if (propertyInfo.GetIndexParameters().Length == 0)
        {
            value = (string)propertyInfo.GetValue(objeto, null);
            value = value == null ? null : value;
            dictionary.Add(propertyInfo.Name.ToString(), value);
        }
    }

    return dictionary;
}
4

3 に答える 3

12

すでに辞書をお持ちの場合は、リフレクションを避けて使用しますDynamicObject

例えば:

public class DynamicDictionary : DynamicObject
{
    private readonly Dictionary<string, object> dictionary;

    public DynamicDictionary(Dictionary<string, object> dictionary)
    {
        this.dictionary = dictionary;
    }

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        return dictionary.TryGetValue(binder.Name, out result);
    }

    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;

        return true;
    }
}

次のように使用できます。

dynamic x = new DynamicDictionary(
    new Dictionary<string, object> {{"Name", "Peter"}});

Console.WriteLine(x.Name);
于 2013-08-17T21:12:26.080 に答える
2

は辞書なのでExpandoObject、次の拡張機能を使用できます。

public static object With(this IDictionary<string, object> obj, IDictionary<string,object> additionalProperties)
{
  foreach (var name in additionalProperties.Keys)
    obj[name] = additionalProperties[name];
  return obj;
}

使用法:

var dynamicObj = new System.Dynamic.ExpandoObject().With(myDictionary);
于 2017-02-12T00:23:38.307 に答える