web-dev-qa-db-ja.com

PropertyInfoからプロパティの値を取得するにはどうすればよいですか?

プロパティのコレクションを持つオブジェクトがあります。特定のエンティティを取得すると、探しているフィールド(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を返しません。このプロパティの値を取得するにはどうすればよいですか?

20
sr28

プロパティが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);
34
dasblinkenlight

プロパティの名前が変更されている場合は、 GetValue を使用する必要があります。

info.GetValue(attr, null);

このメソッドの最後の属性はnullになります。これはインデックス値であり、Value[1,2]などの配列にアクセスする場合にのみ必要です。

事前に属性の名前がわかっている場合は、そのdynamic動作を使用できます。自分でリフレクションを行う必要なく、プロパティを呼び出すことができます。

var x = attr.Guid;
4
Patrick Hofman

PropertyInfo.GetValue()を使用します。プロパティのタイプがGuid?その後、これは動作するはずです:

attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value;

プロパティ値がnullの場合、例外がスローされることに注意してください。

2
helb

で試してください:

attrGuid = (Guid)info.GetValue(attr,null)
2
Alberto