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

C# 当我有一个类,但子类名称是字符串时,如何从子类获取属性

C# 当我有一个类,但子类名称是字符串时,如何从子类获取属性,c#,class,inheritance,subclass,C#,Class,Inheritance,Subclass,我有一个从错误消息中获取子类名称的方法,如下所示 string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error); 我有这个类,并且想访问子类属性,但是当我只有子类名称作为字符串时,我如何才能做到这一点 Java有这样一种方法 Class myClass = Class.forName(jobDesc); 如何在C#中执行相同的操作?您可以使用AppDomain.CurrentDomain.GetAssemblies()

我有一个从错误消息中获取子类名称的方法,如下所示

string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error);
我有这个类,并且想访问子类属性,但是当我只有子类名称作为字符串时,我如何才能做到这一点

Java有这样一种方法

Class myClass = Class.forName(jobDesc);

如何在C#中执行相同的操作?

您可以使用
AppDomain.CurrentDomain.GetAssemblies()

然后使用
获取这些程序集的所有类型。选择many(a=>a.GetTypes())

然后用
.Single(t=>t.name==jobDesc)
选择具有给定名称的一种类型

请记住,
Single
如果不正好有一个元素与条件匹配,就会抛出一个异常。
如果有多个类型具有相同的名称(在不同的名称空间中),则应使用
Where

如果可能没有匹配的类,请使用
SingleOrDefault
,如果没有匹配的元素,则返回
null

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
    .Single(t => t.Name == jobDesc)
如果所需类位于当前执行的程序集中,则也可以使用

System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
    .Single(t => t.Name == jobDesc)

你需要这样做

string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error);
SomeClass myClass = new SomeClass();
// set some class values,

var classType = typeof(SomeClass );                   
PropertyInfo info = classType.GetProperty(jobDesc);
var propertyValue = info.GetValue(myClass, null);

您可能需要做一些小的更改,因为我还没有测试这个解决方案,

我使用下面代码中的属性获得了一个工作的解决方案

PropertyInfo[] properties = typeof(UIStaticFieldErrors).GetProperties();
foreach (PropertyInfo property in properties)
{
    if (property.ToString() == "Boolean " + jobDesc)
    {
         property.SetValue(errorSF, true);
    }
}

我在properties中获取UIStaticFieldErrors的属性,然后迭代,直到获得jobDesc的匹配项,然后将该字段更新为true。变量errorSF是UIStaticFieldErrors的一个实例。

谢谢您的回复,但我收到一个错误“System.Array不包含SelectMany”@user616076的定义您必须包含命名空间
System.Linq
Ok,当我运行它时,我得到这个错误“无法加载一个或多个请求的类型”。检索LoaderExceptions属性以获取更多信息。“我还缺少其他内容吗?@user616076 LoaderExceptions说明了什么?@user616076我为您添加了另一个选项,可能效果更好。