web-dev-qa-db-ja.com

リフレクションを介して文字列プロパティの値を取得するにはどうすればよいですか?

public class Foo
{
   public string Bar {get; set;}
}

リフレクションを介して文字列プロパティのBarの値を取得するにはどうすればよいですか?次のコードは、PropertyInfoタイプがSystem.Stringの場合に例外をスローします

Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

foreach(var property in f.GetType().GetProperties())
{
 object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type
}

私の問題は、プロパティがSystem.Stringを持つインデクサー型であることです。

また、プロパティがインデクサーかどうかはどのようにしてわかりますか?

20
Alan

名前でプロパティを取得できます:

Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

var barProperty = f.GetType().GetProperty("Bar");
string s = barProperty.GetValue(f,null) as string;

フォローアップ質問について:インデクサーは常にItemと名付けられ、ゲッターに引数を持ちます。そう

Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

var barProperty = f.GetType().GetProperty("Item");
if (barProperty.GetGetMethod().GetParameters().Length>0)
{
    object value = barProperty.GetValue(f,new []{1/* indexer value(s)*/});
}
46
Jake

問題を再現できませんでした。インデクサープロパティを持ついくつかのオブジェクトでこれを実行しようとしていないのですか?その場合、発生しているエラーは、Itemプロパティの処理中にスローされます。また、これを行うことができます:


public static T GetPropertyValue<T>(object o, string propertyName)
{
      return (T)o.GetType().GetProperty(propertyName).GetValue(o, null);
}

...somewhere else in your code...
GetPropertyValue<string>(f, "Bar");
5
em70
Foo f = new Foo();
f.Bar = "x";

string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);
4
Handcraftsman
var val = f.GetType().GetProperty("Bar").GetValue(f, null);
4
JP Alioto
Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

foreach(var property in f.GetType().GetProperties())
{
    if(property.Name != "Bar")
    {
         continue;
    }
    object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type
}

そして、これがフォローアップです:

class Test
{
    public class Foo
    {
        Dictionary<string, int> data =new Dictionary<string,int>();
        public int this[string index]
        {
            get { return data[index]; }
            set { data[index] = value; }
        }

        public Foo()
        {
            data["a"] = 1;
            data["b"] = 2;
        }
    }

    public Test()
    {
        var foo = new Foo();
        var property = foo.GetType().GetProperty("Item");
        var value = (int)property.GetValue(foo, new object[] { "a" });
        int i = 0;
    }
}
3
Jake Pearson

次のような拡張メソッドを使用することで、any objectのプロパティ値を簡単に取得できます。

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }
    }

使い方は:

Foo f = new Foo();
f.Bar = "x";
var balbal = f.GetPropertyValue("Bar");
2
Ali
PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;
2
Stan R.

オブジェクトを渡すだけでオブジェクトのプロパティ名を取得するには、この関数を使用できます。

オブジェクトオブジェクトをクラスにして、それに渡すだけです。

 public void getObjectNamesAndValue(object obj)
    {
        Type type = obj.GetType();
        BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
        PropertyInfo[] prop = type.GetProperties(flags);
        foreach (var pro in prop)
        {
            System.Windows.Forms.MessageBox.Show("Name :" + pro.Name + " Value : "+  pro.GetValue(obj, null).ToString());
        }

    }

ただし、これはオブジェクトのプロパティが「パブリック」の場合にのみ機能します

0
Sayed idrees

オブジェクトとnullのgetvalueは私にとってはうまくいきました。投稿いただきありがとうございます。

コンテキスト:新入社員のMVCモデルのすべてのプロパティをループし、フォームに投稿された値を決定します。

newHire =>モデル、多くのプロパティ、投稿されたフォームの値を一連のデータベースレコードに個別に書き込みたい

foreach(var propertyValue in newHire.GetProperties())
{
string propName = propertyValue.Name;

string postedValue = newHire.GetType().GetProperty(propName).GetValue(newHire, null).ToString();

}
0
Chris Cherwin