-3

私は自分のオブジェクトのすべてのプロパティを入力するのが面倒なので、これの代わりに:

myObj.property1 = value1;
myObj.property2 = value2;
myObj.property3 = value3;
myObj.property4 = value4;
myObj.property5 = value5;
...

これを行う方法はありますか?

Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var curValue = collection[curProperty];
    myObj[curProperty] = curValue;   // ??????????????

}
4

4 に答える 4

3

はい、あなたはSystem.Reflection仕事を成し遂げるために使う必要があるでしょう:

for (int i = 1; i < 6; i++)
{
    PropertyInfo prop = myObj.GetType().GetProperty(string.Format("property{0}", i);
    if (prop == null) { continue; }
    prop.SetValue(myObj, collection[prop.Name], null);
}

この例でcollectionは、プロパティ名に文字列インデクサーがあると想定しています(別の方法で回復する必要がある場合があります)。また、プロパティ()が5つしかないことも想定しているi < 6ので、それに応じて設定する必要があります。しかし、あなたはその考えを理解します。


Jim Mischelによるコメントの精神では、シリアル化もオプションです。私はコードを100%使用しているわけではないので、ここでは例を示しませんが、Webサービスを検討します。Webサービスは、すべての作業を(逆)シリアル化で行います。

したがって、XMLファイルを技術的にオブジェクトに逆シリアル化することができ、逆シリアル化のすべての利点を得ることができます-そしてかなりの数があります。私が頭から考えることができるのは、プロパティの値を設定する前にオブジェクトの新しいインスタンスが作成されないということです-フレームワークがどのようにそれを行うのかはわかりません-しかし、私が追いかけたので、それが行われたことはわかっています一度そのようなバグ

于 2013-03-26T18:42:18.333 に答える
1

リフレクションを使用してこれを行うことができますが、これは適切に行うよりもかなり遅くなることに注意してください。

次のようになります。

var prop = typeof(SomeType).GetProperty(propertyName);
prop.SetValue(myObj, newValue, null);

これは、プロパティが存在し、アクセス可能であることを前提としています。

式ツリーを使用し、新しく作成されたラムダをメモリに保存することで、このパフォーマンスを大幅に向上させることができますが、それを書くのは少し複雑です。

全体として、リフレクションの使い方を学ぶための演習として使用している場合を除いて、「これは行わないでください」と言います。

于 2013-03-26T18:43:32.370 に答える
1

System.Reflectionを使用すると、コードは次のようになります。

Object myObj = new Object();
foreach (string curProperty in myCollection.AllKeys) {
    var property= typeof(Object).GetProperty(curProperty);
    property.SetValue(myObj, curValue, null);
}
于 2013-03-26T18:53:25.157 に答える
0

私はそれがあなたが求めているものと正確に一致しないことを知っています、そして反射はあなたが求めている特定の質問を解決します。ただし、怠惰で、すでにキー/値のコレクションがある場合は、Expandoオブジェクトが最適です。このようにして、クラスを宣言する必要すらありません!!!

ExpandoObject

于 2013-03-26T18:50:16.987 に答える