Как назначить значение свойства для объекта без явного вызова имени свойства - PullRequest
0 голосов
/ 11 мая 2018

У меня есть приложение, где у меня есть класс со 100 значениями свойств

Например.

Class RequestData{
 String PropertName1 {get;set;}
 String PropertName2 {get;set;}
 String PropertName3 {get;set;}
 .
 .
 .
 String PropertName100 {get;set;}
}

У меня есть список>, в котором есть все имя свойства и значения свойства.Итак, в идеале это имеет значение

PropertName1 = "Timothy"
PropertName2 = "rajan"
.
.
.
PropertName100 = "alex"

Мне нужно создать экземпляр RequestData и назначить все значения свойств каждому из имен свойств

В этом сценарии мне нужно сделать такчто приведет к сотням строк

 RequestData requestData = new RequestData ();
 requestData.PropertName1 = "Timothy" ;
 requestData.PropertName2 = "Rajan" ;
 requestData.PropertName3 = "Alex" ;

Есть ли лучший способ сделать это?Я могу войти в Список, но не уверен, как сделать это что-то вроде

 RequestData requestData = new RequestData ();
 requestData.[key]= value ;

Надеюсь, я дал понять.Любая помощь будет великолепна.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Да, вы можете сделать это.Но без дополнительных подробностей очень сложно дать «хороший» ответ.Исходя из того, что вы показали (и сделав, вероятно, неверное предположение с моей стороны), вот один из нескольких возможных способов сделать это.Я не очень рекомендую это лично, но, возможно, это (с другими ответами / комментариями) уведет вас по пути, который вы действительно хотите / должны пройти.

Я должен упомянуть, что есть более эффективные методыэто, но хотел показать элементарный метод, который может быть немного более очевидным в отношении того, что на самом деле происходит.

    static void Main()
    {
        var propertyList = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("PropertyName1","Value1"),
            new KeyValuePair<string, string>("PropertyName2","Value2"),
            new KeyValuePair<string, string>("PropertyName3","Value3"),
            new KeyValuePair<string, string>("PropertyName4","Value4"),
            new KeyValuePair<string, string>("PropertyName5","Value5"),
        };

        var requestData = new RequestData();
        //reflection allows you to loop through the properties of a class
        foreach (var property in requestData.GetType().GetProperties())
        {
            //you can loop through your list (here I made an assumption that it's a list of KeyValuePair)
            foreach (var keyValuePair in propertyList)
            {
                //if the key matches the property name, assign the value
                if (property.Name.Equals(keyValuePair.Key))
                {
                    property.SetValue(requestData, keyValuePair.Value);
                }
            }
        }

        //to show that they are properly set
        Console.WriteLine(requestData.PropertyName1);
        Console.WriteLine(requestData.PropertyName2);
        Console.WriteLine(requestData.PropertyName3);
        Console.WriteLine(requestData.PropertyName4);
    }
}

public class RequestData
{
    public string PropertyName1 { get; set; }
    public string PropertyName2 { get; set; }
    public string PropertyName3 { get; set; }
    public string PropertyName4 { get; set; }
}
0 голосов
/ 11 мая 2018

Вбрасывание другого похожего ответа в кольцо, используя список строк и разбивая их на знак =, затем используя отражение, чтобы попытаться получить имя свойства, и, если оно не равно нулю, установите значение свойстванаш объект:

private static void Main()
{
    var propNamesAndValues = new List<string>
    {
        "PropertName1 = Timothy",
        "PropertName2 = Rajan",
        "PropertName100 = Alex",
    };

    var requestData = new RequestData();

    foreach (var propNameValue in propNamesAndValues)
    {
        var parts = propNameValue.Split('=');
        if (parts.Length < 2) continue;

        var propName = parts[0].Trim();
        var propValue = parts[1].Trim();

        typeof(RequestData).GetProperty(propName)?.SetValue(requestData, propValue);
    }

    Console.WriteLine("{0} {1} {2}", requestData.PropertName1,
        requestData.PropertName2, requestData.PropertName100);

    GetKeyFromUser("\nDone! Press any key to exit...");
}

Выход

enter image description here

0 голосов
/ 11 мая 2018

Вы можете сделать это с отражением

_list = new List<Tuple<string, string>>
   {
      new Tuple<string, string>("PropertName1", "asd"),
      new Tuple<string, string>("PropertName2", "sdfgds"),
      new Tuple<string, string>("PropertName3", "dfgdfg"),
      new Tuple<string, string>("PropertName100", "dfgdfg")
   };


var requestData = new RequestData();

foreach (var tuple in _list)
{
   requestData.GetType()
              .GetProperty(tuple.Item1, BindingFlags.Public| BindingFlags.NonPublic | BindingFlags.Instance )
             ?.SetValue(requestData, tuple.Item2);

}

Или методом расширения

public void UpdateProperties<T>(this T obj, List<Tuple<string, string>> list) where T : class
{
   foreach (var tuple in _list)
   {
      var type = obj.GetType();
         var property = type.GetProperty(tuple.Item1, BindingFlags.Public| BindingFlags.NonPublic | BindingFlags.Instance );
      if(property == null)
         continue;
      property.SetValue(obj, tuple.Item2);
   }
}

Полная демонстрация здесь

Дополнительные ресурсы

Type.GetProperty Method (String)

Поиск открытого свойства с указанным именем.

PropertyInfo.SetValue Метод (Object, Object)

Устанавливает значение свойства указанного объекта.

Перечисление BindingFlags

Указывает флаги, управляющие связыванием и способом, с помощью которого поиск членов и типов осуществляется с помощью отражения.

...