如何将未引用类型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
}
}
}
任何欣赏的想法
如果您知道属性的名称,您可以使用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;