Как динамически получить экземпляр свойства объекта с помощью отражения - PullRequest
0 голосов
/ 08 мая 2018

Я нашел много примеров, которые ПОЧТИ говорят мне, что мне нужно знать. Но пока все предполагает, что у меня уже есть экземпляр свойства, для которого я хочу установить значение. Но у меня нет экземпляра. У меня есть объект PropertyInfo. Я могу динамически получить имя свойства, но для вызова SetValue () я должен иметь экземпляр свойства для передачи в метод. Как получить экземпляр свойства, значение которого мне нужно установить? Вот мой код с ??? где экземпляр имущества должен быть предоставлен. Как получить экземпляр свойства, а не только объект PropertyInfo? (Причина, по которой я пишу этот метод, заключается в том, что я не могу гарантировать, какие столбцы будут возвращать различные хранимые процедуры.)

protected new void MapDbResultToFields(DataRow row, DataColumnCollection columns)
{
    Console.WriteLine("Entered Clinician.MapDbResultToFields");
    var properties = this.GetType().GetProperties();
    Console.WriteLine("Properties Count: " + properties.Length);
    foreach (DataColumn col in columns)
    {
        Console.WriteLine("ColumnName: " + col.ColumnName);
    }
    foreach (var property in properties)
    {
        string propName = property.Name.ToLower();
        Console.WriteLine("Property name: " + propName);
        Console.WriteLine("Index of column name: " + columns.IndexOf(propName));
        Console.WriteLine("column name exists: " + columns.Contains(propName));
        if (columns.Contains(propName))
        {
            Console.WriteLine("PropertyType is: " + property.PropertyType);
            switch (property.PropertyType.ToString())
            {
                case "System.String":
                    String val = row[propName].ToString();
                    Console.WriteLine("RowColumn Value (String): " + val);
                    property.SetValue(???, val, null);
                    break;
                case "System.Nullable`1[System.Int64]":
                case "System.Int64":
                    Int64.TryParse(row[propName].ToString(), out var id);
                    Console.WriteLine("RowColumn Value (Int64): " + id);
                    property.SetValue(???, id, null);
                    break;
                case "System.Boolean":
                    Boolean.TryParse(row[propName].ToString(), out var flag);
                    Console.WriteLine("RowColumn Value (Boolean): " + flag);
                    property.SetValue(???, flag, null);
                    break;
            }

        }
        else
        {
            Console.WriteLine("Property name not found in columns list");
        }
    }
}

Ответы [ 2 ]

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

Так как вы получаете свойства ЭТОГО ... у вас фактически есть экземпляр объекта, который вы пытаетесь установить. Просто используйте ключевое слово THIS при его установке.

Когда вы получаете свойства, как это

var properties = this.GetType().GetProperties();

Вы устанавливаете свойства, как это

foreach(var property in properties)
{
    property.SetValue(this, id, null);
}

Это не будет работать, если вы попытались получить свойства от объекта, у которого нет экземпляра.

var properties = SomeObject.GetType().GetProperties();

Надеюсь, это ответит на ваши вопросы!

Приветствия

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

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

property.SetValue(this, val, null);

Скорее всего, вы искали.

...