c# 如何获取输入缓冲区 属性 值作为字符串

c# how to get input buffer property value as string

我需要获取输入缓冲区中每个 属性 的值,我可以获取 属性 的名称但我无法获取值,我需要添加名称和字典中的值。这是我的代码:

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() );
    }
}

我遇到了这个异常:对象引用未设置到对象的实例

您应该为每个方法调用使用变量,例如 var rowType = Row.GetType();

例如,

Row.GetType().GetProperty(inputColumn.Name) 可以替换为 inputColumn

您可以在同一方法中重复使用变量,堆栈跟踪将向您显示引发空引用的行。请检查堆栈跟踪,它会显示导致错误的方法名称。

我认为 .GetValue(Row) returns 为空。

您只需像这样在 inputColumn 对象上调用 GetValue

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 来简化整个方法,并像这样使其通用:

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 子句的 return 字符串值的属性,您还可以更加安全:

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

或者,如果您想包括其他 属性 类型(例如 int),则您需要恢复使用 ToString:

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

这样您就可以将此方法重用于其他对象类型。