Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net - Fatal编程技术网

C# 如何创建类型的实例并按名称设置成员值?

C# 如何创建类型的实例并按名称设置成员值?,c#,.net,C#,.net,我阅读了一个命令列表的XML,其中每个命令都与此类似 <Read Id="3" LocationId="21"/> 当我使用Activator.CreateInstance时,是否有方法将值3和21分配给名为“Id”和“LocationId”的成员?我事先不知道我在哪个ICommand上,每个ICommand都有不同的成员(除非它们都只共享一种方法) 像maybe(伪代码) commandObject=Activator.CreateInstance(cType); foreach

我阅读了一个命令列表的XML,其中每个命令都与此类似

<Read Id="3" LocationId="21"/>
当我使用Activator.CreateInstance时,是否有方法将值3和21分配给名为“Id”和“LocationId”的成员?我事先不知道我在哪个ICommand上,每个ICommand都有不同的成员(除非它们都只共享一种方法)

像maybe(伪代码)

commandObject=Activator.CreateInstance(cType);
foreach(元素中的XMLAttribute属性){

commandObject动态变量类型已在运行时解析,如果您知道您的命令将始终包含Id和LocationId属性,您可以执行以下操作:

dynamic commandObject = Activator.CreateInstance(cType);
commandObject.Id = 3;
commandObject.LocationId = 21;
否则,您必须首先使用反射来检查它是否存在:

PropertyInfo prop = commandObject.GetType().GetProperty("Id");
if(null != prop && prop.CanWrite)
{
    prop.SetValue(commandObject, 3, null);
}

如果您知道您的命令将始终包含Id和LocationId属性,则动态变量类型已在运行时解析,您可以执行以下操作:

dynamic commandObject = Activator.CreateInstance(cType);
commandObject.Id = 3;
commandObject.LocationId = 21;
否则,您必须首先使用反射来检查它是否存在:

PropertyInfo prop = commandObject.GetType().GetProperty("Id");
if(null != prop && prop.CanWrite)
{
    prop.SetValue(commandObject, 3, null);
}

如果您知道您的命令将始终包含Id和LocationId属性,则动态变量类型已在运行时解析,您可以执行以下操作:

dynamic commandObject = Activator.CreateInstance(cType);
commandObject.Id = 3;
commandObject.LocationId = 21;
否则,您必须首先使用反射来检查它是否存在:

PropertyInfo prop = commandObject.GetType().GetProperty("Id");
if(null != prop && prop.CanWrite)
{
    prop.SetValue(commandObject, 3, null);
}

如果您知道您的命令将始终包含Id和LocationId属性,则动态变量类型已在运行时解析,您可以执行以下操作:

dynamic commandObject = Activator.CreateInstance(cType);
commandObject.Id = 3;
commandObject.LocationId = 21;
否则,您必须首先使用反射来检查它是否存在:

PropertyInfo prop = commandObject.GetType().GetProperty("Id");
if(null != prop && prop.CanWrite)
{
    prop.SetValue(commandObject, 3, null);
}

由于在运行时之前无法知道必须设置哪些属性,因此除了纯反射之外,我想不出更好的方法来设置这些属性

object commandObject = Activator.CreateInstance(cType);
cType.GetProperty("Id").SetValue(commandObject, 3, null);
cType.GetProperty("LocationId").SetValue(commandObject, 3, null);
这将根据您的示例设置属性。要使其通用,您可以在每个属性的循环中运行它(适应上一次编辑):


一些注意事项。它在运行时不检查任何内容,因为类型是动态确定的,根据XML结构,属性需要存在,因此此代码还可以在类型错误的任何时候抛出
NullReferenceException
。您可以在反射调用中执行一些验证,并做出更适当的反应,例如h、 不幸的是,在编译时无法验证这一点。

因为在运行时之前无法知道必须设置哪些属性,所以除了纯反射之外,我想不出更好的方法来设置这些属性。简单的实现可能有点像这样:

object commandObject = Activator.CreateInstance(cType);
cType.GetProperty("Id").SetValue(commandObject, 3, null);
cType.GetProperty("LocationId").SetValue(commandObject, 3, null);
这将根据您的示例设置属性。要使其通用,您可以在每个属性的循环中运行它(适应上一次编辑):


一些注意事项。它在运行时不检查任何内容,因为类型是动态确定的,根据XML结构,属性需要存在,因此此代码还可以在类型错误的任何时候抛出
NullReferenceException
。您可以在反射调用中执行一些验证,并做出更适当的反应,例如h、 不幸的是,在编译时无法验证这一点。

因为在运行时之前无法知道必须设置哪些属性,所以除了纯反射之外,我想不出更好的方法来设置这些属性。简单的实现可能有点像这样:

object commandObject = Activator.CreateInstance(cType);
cType.GetProperty("Id").SetValue(commandObject, 3, null);
cType.GetProperty("LocationId").SetValue(commandObject, 3, null);
这将根据您的示例设置属性。要使其通用,您可以在每个属性的循环中运行它(适应上一次编辑):


一些注意事项。它在运行时不检查任何内容,因为类型是动态确定的,根据XML结构,属性需要存在,因此此代码还可以在类型错误的任何时候抛出
NullReferenceException
。您可以在反射调用中执行一些验证,并做出更适当的反应,例如h、 不幸的是,在编译时无法验证这一点。

因为在运行时之前无法知道必须设置哪些属性,所以除了纯反射之外,我想不出更好的方法来设置这些属性。简单的实现可能有点像这样:

object commandObject = Activator.CreateInstance(cType);
cType.GetProperty("Id").SetValue(commandObject, 3, null);
cType.GetProperty("LocationId").SetValue(commandObject, 3, null);
这将根据您的示例设置属性。要使其通用,您可以在每个属性的循环中运行它(适应上一次编辑):


一些注意事项。它在运行时不检查任何内容,因为类型是动态确定的,根据XML结构,属性需要存在,因此此代码还可以在类型错误的任何时候抛出
NullReferenceException
。您可以在反射调用中执行一些验证,并做出更适当的反应,例如h、 不幸的是,在编译时无法验证这一点。

您能保证通过
CreateInstance
创建的任何类型都将始终具有这两个“Id”和“LocationId”吗?可以修改这些类吗?@Alejandro是的,我现在可以修改任何东西,不能保证每个命令都会有这两个成员。我的意思是,如果没有使用它,我添加它可能没有意义。你能保证通过
CreateInstance
创建的任何类型都会始终有这两个成员吗“Id”和“LocationId”“?可以修改这些类吗?@Alejandro是的,我现在可以修改任何东西,不能保证每个命令都有这两个成员。我的意思是,如果没有使用它,我添加它可能没有意义。你能保证你创建的任何类型,尽管
CreateInstance
,都会有这两个成员吗“Id”和“LocationId”“?可以修改这些类吗?@Alejandro是的,我现在可以修改任何东西,不能保证每个命令都有这两个成员。我的意思是,如果没有使用它,我添加它可能没有意义。你能保证你创建的任何类型,尽管
CreateInstance
,都会有这两个成员吗“Id”和“LocationId”?有可能修改这些类吗?@Alejandro是的,我现在可以修改任何东西,不能保证每个命令都会有这些类