Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建数据类型未知的新数据行字段?_C#_Asp.net_.net_Reflection - Fatal编程技术网

C# 如何创建数据类型未知的新数据行字段?

C# 如何创建数据类型未知的新数据行字段?,c#,asp.net,.net,reflection,C#,Asp.net,.net,Reflection,问题标题措词不当,以下是一些背景: 我正在使用反射在数据表中创建一个数据行,该表中的字段具有另一个对象的属性名称、值和类型,尽管我不知道如何正确设置类型,但以下内容并没有让intellisense满意: Application app = Get(id, context); // Method args provide these DataTable dt = new DataTable(); DataRow dr = dt.NewRow(); foreach (PropertyInfo p

问题标题措词不当,以下是一些背景:

我正在使用反射在
数据表
中创建一个
数据行
,该表中的字段具有另一个对象的属性名称、值和类型,尽管我不知道如何正确设置类型,但以下内容并没有让intellisense满意:

Application app = Get(id, context); // Method args provide these

DataTable dt = new DataTable();
DataRow dr = dt.NewRow();

foreach (PropertyInfo p in app.GetType().GetProperties())
{
    dr.SetField<p.PropertyType>(p.Name, p.GetValue(p, null)); // attempt 1
    dr.SetField<typeof(p.GetType())>(p.Name, p.GetValue(p, null)); // attempt 2
    dr.SetField<p.GetType()>(p.Name, p.GetValue(p, null)); // attempt 3
}

return dt;
Application-app=Get(id,context);//方法参数提供了这些
DataTable dt=新的DataTable();
DataRow dr=dt.NewRow();
foreach(app.GetType().GetProperties()中的PropertyInfo p)
{
dr.SetField(p.Name,p.GetValue(p,null));//尝试1
dr.SetField(p.Name,p.GetValue(p,null));//尝试2
dr.SetField(p.Name,p.GetValue(p,null));//尝试3
}
返回dt;

使用
反射时要记住的一件事是,一旦开始使用它,就必须一直使用
反射

不能指定这样的泛型参数。必须提供类型名称。如果您不知道类型名称,那么您需要使用
Reflection
获取方法,并通过提供
DataRow
实例和值来调用它的
Invoke
方法


作为提示,一旦您从
DataRowExtensions
获得
SetField
method,您可以使用method通过提供一个类型实例(在本例中是
p.PropertyType
)来构造一个泛型方法。

没有注释来伴随否决票?我没有否决你,但是查看有关泛型的文档是明智的。和反射,因为您可能最终需要动态调用
dr.SetField