c# как получить значение свойства входного буфера в виде строки - PullRequest
0 голосов
/ 13 марта 2020

Мне нужно получить значение каждого свойства во входном буфере, я могу получить имя свойства, но не могу получить значение, мне нужно добавить имя и значение в словаре. Это мой код:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Dictionary<string, string> body = new Dictionary<string, string>();

    foreach (PropertyInfo inputColumn in Row.GetType().GetProperties())
    {
        if (!inputColumn.Name.EndsWith("IsNull"))
                body.Add(inputColumn.Name, Row.GetType().GetProperty(inputColumn.Name).GetValue(Row).ToString() );
    }
}

Я получил это исключение: ссылка на объект не установлена ​​на экземпляр объекта

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Вам просто нужно вызвать GetValue для объекта inputColumn следующим образом:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Dictionary<string, string> body = new Dictionary<string, string>();

    foreach (PropertyInfo inputColumn in Row.GetType().GetProperties())
    {
        if (!inputColumn.Name.EndsWith("IsNull"))
        {
            body.Add(inputColumn.Name, 
               (string)inputColumn.GetValue(Row));
        }
    }
}

Вы можете упростить весь метод с помощью небольшого количества Linq, а также сделать его обобщенным c как this:

public void ProcessRow<T>(T item)
{
    var body = typeof(T) // Get the type
        .GetProperties() // Get all properties
        .Where(p => !p.Name.EndsWith("IsNull")) // Exclude properties ending with "IsNull"
        .ToDictionary( // Return a dictionary
            p => p.Name, 
            p => (string) p.GetValue(item));
}

Вы могли бы быть еще безопаснее, если бы вызывали только те свойства, которые возвращают строковые значения, с дополнительным предложением Where:

.Where(p => p.PropertyType == typeof(string))

Или если вы хотите включите другие типы свойств (например, int), затем вам нужно будет вернуться к использованию ToString:

p => p.GetValue(item).ToString()

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

0 голосов
/ 13 марта 2020

вы должны использовать переменные для каждого вызова метода, например var rowType = Row.GetType();. Например,

Row.GetType().GetProperty(inputColumn.Name) можно заменить на inputColumn.

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

Полагаю, что .GetValue(Row) возвращает ноль.

...