代码之家  ›  专栏  ›  技术社区  ›  user616076

当我将类但子类名称作为字符串时,如何从子类中获取属性

  •  0
  • user616076  · 技术社区  · 9 年前

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

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

    我有Class并想访问子类属性,但当我只有字符串形式的子类名时,我该怎么做呢。

    Java有一个这样工作的方法

    Class myClass = Class.forName(jobDesc);
    

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

    3 回复  |  直到 9 年前
        1
  •  0
  •   fhnaseer    9 年前

    你需要这样做,

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

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

        2
  •  0
  •   Domysee    9 年前

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

    请记住 Single 抛出一个 例外 如果不是正好有1个元素与条件匹配。
    如果你有 多种类型 使用相同的名称(在不同的名称空间中) 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)
    
        3
  •  0
  •   user616076    9 年前

    我用下面的代码使用Properties获得了一个有效的解决方案

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

    我在属性中获取UIStaticFieldErrors的属性,然后遍历,直到找到jobDesc的匹配项,然后将该字段更新为true。变量errorSF是UIStaticFieldErrors的实例。