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()
这样您就可以将此方法重用于其他对象类型。
我需要获取输入缓冲区中每个 属性 的值,我可以获取 属性 的名称但我无法获取值,我需要添加名称和字典中的值。这是我的代码:
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()
这样您就可以将此方法重用于其他对象类型。