プロパティのコレクションを持つオブジェクトがあります。特定のエンティティを取得すると、探しているフィールド(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
を返しません。このプロパティの値を取得するにはどうすればよいですか?
プロパティがstatic
でない限り、PropertyInfo
オブジェクトを取得してプロパティの値を取得するだけでは不十分です。 「プレーンな」C#を記述し、MyProperty
などのプロパティの値を取得する必要がある場合、次のように記述します。
var val = obj.MyProperty;
プロパティ名(取得するもの)とオブジェクト(取得する場所)の2つのものを指定します。
PropertyInfo
は「what」を表します。 「どこから」を個別に指定する必要があります。電話するとき
var val = info.GetValue(obj);
「from where」をPropertyInfo
に渡し、オブジェクトからプロパティの値を抽出できるようにします。
注:.NET 4.5より前の場合、2番目の引数としてnullを渡す必要があります。
var val = info.GetValue(obj, null);
プロパティの名前が変更されている場合は、 GetValue
を使用する必要があります。
info.GetValue(attr, null);
このメソッドの最後の属性はnull
になります。これはインデックス値であり、Value[1,2]
などの配列にアクセスする場合にのみ必要です。
事前に属性の名前がわかっている場合は、そのdynamic
動作を使用できます。自分でリフレクションを行う必要なく、プロパティを呼び出すことができます。
var x = attr.Guid;
PropertyInfo.GetValue()
を使用します。プロパティのタイプがGuid?
その後、これは動作するはずです:
attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value;
プロパティ値がnullの場合、例外がスローされることに注意してください。
で試してください:
attrGuid = (Guid)info.GetValue(attr,null)