【问题标题】:How do I get the properties from a subclass when I have the class but subclass name as a string当我有类但子类名称作为字符串时,如何从子类中获取属性
【发布时间】:2016-04-10 07:11:27
【问题描述】:

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

string jobDesc = getDtlName(serviceResponse.ErrorMessages[0].Error);

我有类并且想要访问子类属性,但是当我只有子类名称作为字符串时,我该怎么做。

Java 有一个像这样工作的方法

Class myClass = Class.forName(jobDesc);

如何在 C# 中做同样的事情?

【问题讨论】:

标签: c# class inheritance subclass


【解决方案1】:

您可以使用AppDomain.CurrentDomain.GetAssemblies()获取所有加载的程序集
然后使用.SelectMany(a => a.GetTypes())
获取这些程序集的所有类型 然后用.Single(t => t.Name == jobDesc)选择给定名称的一种

请记住,如果不是 1 个元素完全符合条件,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)

【讨论】:

  • 感谢您的回复,但我收到错误消息“System.Array 不包含 SelectMany 的定义”
  • @user616076 你必须包含命名空间System.Linq
  • 好的,当我运行它时,我收到此错误“无法加载一个或多个请求的类型。检索 LoaderExceptions 属性以获取更多信息。我还有什么遗漏的吗?
  • @user616076 LoaderExceptions 说什么?
  • @user616076 我已经为您添加了另一个选项,也许这样效果更好。
【解决方案2】:

你需要做这样的事情,

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

您可能需要做一些小改动,因为我尚未测试此解决方案,

【讨论】:

    【解决方案3】:

    我设法通过下面的代码使用属性获得了一个可行的解决方案

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      相关资源
      最近更新 更多