2

カスタム列挙型のクラスがあります:

public enum Capabilities{
 PowerSave= 1,
 PnP =2,
 Shared=3, }

私のクラス

public class Device
{
       ....
  public Capabilities[] DeviceCapabilities
  {
     get { // logic goes here}
  }

実行時にリフレクションを使用してこのフィールドの値を取得する方法はありますか? 次のことを試しましたが、null参照例外が発生しました

PropertyInfo[] prs = srcObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
 foreach (PropertyInfo property in prs)
 {
     if (property.PropertyType.IsArray)
     {
         Array a = (Array)property.GetValue(srcObj, null);
     }    
 }

編集: ご回答ありがとうございます。私が本当に必要としているのは、列挙型を指定せずに値を動的に取得する方法です。何かのようなもの:

string enumType = "enumtype"
var property = typeof(Device).GetProperty(enumType);

それは可能ですか?

4

4 に答える 4

1

以下はあなたが望むことをするべきです。

var property = typeof(Device).GetProperty("DeviceCapabilities");

var deviceCapabilities = (Capabilities[])property.GetValue(device);

このメソッドObject PropertyInfo.GetValue(Object)は .NET 4.5 で新しく追加されたことに注意してください。以前のバージョンでは、インデックスに追加の引数を追加する必要がありました。

var deviceCapabilities = (Capabilities[])property.GetValue(device, null);
于 2013-01-09T17:09:10.220 に答える
0

あなたはこれを試すことができます

foreach (PropertyInfo property in prs)
{
    string[] enumValues = Enum.GetNames(property.PropertyType);
}

それが役に立てば幸い。

于 2013-03-23T20:37:18.580 に答える
0

これはうまくいくはずです:

    var source = new Device();

    var property = source.GetType().GetProperty("DeviceCapabilities");
    var caps = (Array)property.GetValue(source, null);

    foreach (var cap in caps)
        Console.WriteLine(cap);
于 2013-01-09T17:08:18.893 に答える
0

Enum のすべての可能な値を列挙し、配列として返したい場合は、次のヘルパー関数を試してください。

public class EnumHelper {
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
}

次に、単に呼び出すことができます:

Capabilities[] array = EnumHelper.GetValues<Capabilities>();

それがあなたの求めているものではない場合、私はあなたが何を意味するのかわかりません.

于 2013-01-09T17:13:42.817 に答える