如何将未引用类型Object转换为实际对象

本文关键字:对象 转换 Object 引用类型 | 更新日期: 2023-09-27 17:58:39

也许这个问题会让你感到困惑,但请帮助我

在.NET 4.0中,C#语言

我有两个项目,一个是库为类定义类和属性标记信息,另一个是处理从该库声明的类的反射的项目。

问题是,在不引用库的情况下,我只使用与反射相关的类来读取程序集,并且必须获取在对象类中声明的属性的值。

例如

---在LIB项目中,名为LIB.dll

public class MarkAttribute: Attribute
{
    public string A{get;set;}
    public string B{get;set;}
}
[Mark(A="Hello" B="World")]
public class Data
{
}

---反射项目

public void DoIt()
{
   string TypeName="Lib.Data";
   var asm=Assembly.LoadFrom("lib.dll");
   foreach (var x in asm.GetTypes())
   {
      if (x.GetType().Name=="Data")
      {
        var obj=x.GetType().GetCustomAttributes(false);
        //now if i make reference to lib.dll in the usual way , it is ok
        var mark=(Lib.MarkAttribute)obj;
        var a=obj.A ; 
        var b=obj.B ;
       //but if i do not make that ref
       //how can i get  A,B value
      }
   }
}

任何欣赏的想法

如何将未引用类型Object转换为实际对象

如果您知道属性的名称,您可以使用dynamic而不是反射:

 dynamic mark = obj;
 var a = obj.A; 
 var b = obj.B;

您也可以使用反射来检索属性的属性:

Assembly assembly = Assembly.LoadFrom("lib.dll");
Type attributeType = assembly.GetType("Lib.MarkAttribute");
Type dataType = assembly.GetType("Lib.Data");
Attribute attribute = Attribute.GetCustomAttribute(dataType, attributeType);
if( attribute != null )
{
    string a = (string)attributeType.GetProperty("A").GetValue(attribute, null);
    string b = (string)attributeType.GetProperty("B").GetValue(attribute, null);
    // Do something with A and B
}

您可以调用属性的getter:

var attributeType = obj.GetType();
var propertyA = attributeType.GetProperty("A");
object valueA = propertyA.GetGetMethod().Invoke(obj, null)

您需要删除许多GetTypes()调用,因为您已经有了一个Type对象。然后可以使用GetProperty检索自定义属性的属性。

foreach (var x in asm.GetTypes())
{
   if (x.Name=="Data")
   {
       var attr = x.GetCustomAttributes(false)[0]; // if you know that the type has only 1 attribute
       var a = attr.GetType().GetProperty("A").GetValue(attr, null);
       var b = attr.GetType().GetProperty("B").GetValue(attr, null);
    }
}
var assembly = Assembly.Load("lib.dll");
dynamic obj = assembly.GetType("Lib.Data").GetCustomAttributes(false)[0];
var a = obj.A;
var b = obj.B;