我有一个拥有一系列属性的对象。当我获得特定实体时,我可以看到我正在寻找(opportunityid
)的字段,并且它的Value
属性是此机会的Guid
。这是我想要的价值,但它不会永远是一个机会,因此我不能总是看opportunityid
,所以我需要根据提供的输入获得该字段用户。
到目前为止我的代码是:
Guid attrGuid = new Guid();
BusinessEntityCollection members = CrmWebService.RetrieveMultiple(query);
if (members.BusinessEntities.Length > 0)
{
try
{
dynamic attr = members.BusinessEntities[0];
//Get collection of opportunity properties
System.Reflection.PropertyInfo[] Props = attr.GetType().GetProperties();
System.Reflection.PropertyInfo info = Props.FirstOrDefault(x => x.Name == GuidAttributeName);
attrGuid = info.PropertyType.GUID; //doesn't work.
}
catch (Exception ex)
{
throw new Exception("An error occurred when retrieving the value for " + attributeName + ". Error: " + ex.Message);
}
}
动态attr
包含我正在寻找的字段(在本例中为opportunityid
),而该字段又包含值字段,这是正确的Guid
。但是,当我收到PropertyInfo
信息(opportunityid
)时,它不再具有Value
属性。我尝试查看PropertyType.GUID
,但这并没有返回正确的Guid
。我怎样才能获得这个属性的值?
答案 0 :(得分:29)
除非属性为static
,否则获取PropertyInfo
对象获取属性值是不够的。当您编写“普通”C#并且需要获取某些属性的值时,比如MyProperty
,您可以这样写:
var val = obj.MyProperty;
你提供两件事 - 物业名称(即获得的物品)和物品(即从哪里获得)。
PropertyInfo
代表“什么”。您需要单独指定“从哪里”。当你打电话
var val = info.GetValue(obj);
你将“从哪里”传递给PropertyInfo
,让它从你的对象中提取属性的值。
注意:在.NET 4.5之前,您需要传递null作为第二个参数:
var val = info.GetValue(obj, null);
答案 1 :(得分:4)
如果属性名称发生变化,您应该使用GetValue
:
info.GetValue(attr, null);
该方法的最后一个属性可以是null
,因为它是索引值,只有在访问数组时才需要,例如Value[1,2]
。
如果您事先知道属性的名称,则可以使用它的dynamic
行为:您可以调用该属性而无需自己进行反射:
var x = attr.Guid;
答案 2 :(得分:2)
使用PropertyInfo.GetValue()
。假设您的属性的类型为Guid?
,那么这应该有效:
attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value;
请注意,如果属性值为null,则抛出异常。
答案 3 :(得分:2)
尝试:
attrGuid = (Guid)info.GetValue(attr,null)
答案 4 :(得分:0)
补充一点,这可以通过反射来实现(即使对于未实例化的嵌套类/类型中的属性)
Imports System
Imports System.Reflection
Public Class Program
Public Shared Sub Main()
Dim p = New Person()
For Each nestedtype in p.Gettype().GetNestedTypes()
For Each prop in nestedtype.GetProperties(BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Static)
Console.WriteLine(nestedtype.Name & " => " & prop.Name)
Next
Next
End Sub
End Class
Public Class Person
Public Property Name As String
Public Property AddressDetail As Address
Public Class Address
Public Property Street As String
Public Property CountryDetail As Country
End Class
Public Class Country
Public Property CountryName As String
End Class
End Class
打印以下内容:
地址 => 街道
地址 => 国家详情
国家 => 国家名称