2

Dictionary<String, String>クラスの例を、キーが変数名(クラスフィールド名)で値が変数の現在割り当てられている値に変換することを何度も考えています。したがって、単純なクラスがあります。

public class Student
{
    public String field1;
    public Int64 field2;
    public Double field3;
    public Decimal field4;

    public String SomeClassMethod1()
    {
        ...
    }
    public Boolean SomeClassMethod2()
    {
        ...
    }
    public Int64 SomeClassMethod1()
    {
        ...
    }
}

私はそれが次のようになることを期待しています:

static void Main(String[] args)
{
    Student student = new Student(){field1 = "", field2 = 3, field3 = 3.0, field4 = 4.55m};
    Dictionary<String, String> studentInDictionary = ConvertAnyToDictionary<Student>(student);
}

public Dictionary<String, String> ConvertAnyToDictionary<T>(T value) where T:class
{
...
}

それを実現する方法についてのアイデアはありますか?アドバイスがあればよろしくお願いします。

EDIT1: 期待される結果:

studentInDictionary[0] = KeyValuePair("field1", "");
studentInDictionary[1] = KeyValuePair("field2", (3).ToString());
studentInDictionary[2] = KeyValuePair("field3", (3.0).ToString());
studentInDictionary[3] = KeyValuePair("field4", (4.55m).ToString());
4

3 に答える 3

3

これを行う方法は次のとおりです。

public static Dictionary<String, String> ConvertAnyToDictionary<T>(T value) where T : class {
    var fields = typeof(T).GetFields();
    var properties = typeof(T).GetProperties();

    var dict1 = fields.ToDictionary(x => x.Name, x => x.GetValue(value).ToString());
    var dict2 = properties.ToDictionary(x => x.Name, x => x.GetValue(value, null).ToString());

    return dict1.Union(dict2).ToDictionary(x => x.Key, x=> x.Value);
}

編集:フィールドプロパティの両方をカウントしています。プロパティのみを使用する場合は、そのまま使用できますdict2

およびメソッドBindingFlagsが受け取る引数を確認することをお勧めします。GetFields()GetProperties()

于 2013-02-27T09:13:52.230 に答える
1
 var proInfos = student.GetType().GetProperties();

          if(proInfos!=null)
             {
                   Dictionary<string,string> dict= new Dictionary<string, string>();


             foreach (var propertyInfo in proInfos)
             {
                var tv = propertyInfo.GetValue(currentObj, null);

                 if(tv!=null)
                 {
                    if(dict.ContainsKey(propertyInfo.Name))
                        continue;

                    dict.Add(propertyInfo.Name, tv.ToString());
                 }


                }
             }
于 2013-02-27T09:14:48.713 に答える
0

既存のシリアライザー(XmlまたはJSON)を使用してシリアル化するか、リフレクションを使用してシリアル化することができます。

リフレクションを使用してフィールドを取得する方法の例を次に示します。

BindingFlag.Defaultを使用してGetType()。GetFieldsからフィールドを取得していません

于 2013-02-27T09:09:39.200 に答える