からの情報を返します。 - EDIT--私が何をしようとしているのかを明確にするために書き換えます。それは簡潔ではないが、文脈は理解に役立つかもしれないという謝罪。リフレクション「GetValue」を使用して、辞書
私はさまざまなシナリオに対して多数のシミュレーションを実行するプログラムを用意しています。これらのシミュレーションとシナリオの結果をクラス(「結果クラス」)に格納し、基本結果をクラスのプロパティとして格納し、さまざまなシナリオと感度をクラス内の辞書に格納します。
異なるユーザーはシミュレーションと異なる出力が必要なので、ユーザーがカスタムレポートを生成できるようにする方法を開発しようとしています。これを行うには、私は反射を使用しています。私はリフレクションを使用してResultsクラスの各Propertyを処理し、Reportクラスと同じ階層を使用してツリービューに追加します。ユーザーは、ツリービューをブラウズし、各プロパティを表示し、レポートで必要なものを選択することができます。例えば::
Results.TotalCapacity; or:
Results.UsableCapacity; or
Results.Scenarios[HighCase].TotalCapacity; or
Results.Sensitivity.ModifiedCapacity.
関心のあるアイテムにプロパティの枝を説明区切られた文字列 - ユーザーがレポートするプロパティを選択すると
は、私が「パス」にこれを有効にするツリー階層を使用します最終的には、これらのパスを解析するためにリフレクションを使用し、それらのパスから値を取得したいと考えています。
コードをthis linkから大きく借りてしまっていますが、パス内のオブジェクトの1つが辞書の場合、適切なオブジェクトを取得するための最良の方法では苦労しています。
私はこれをうまく機能させることができましたが、どのように改良したり、より堅牢にするかについてのフィードバックをいただければ幸いです。辞書をリストにキャストして、インデックスを介してキーをつかむことは、明らかに最適ではありません。私は、辞書キーを返すために私の 'パス'コードを変更することができますが、リフレクションを使用してキーから辞書の値を取得する方法はわかりません。
コードを次のように
public object GetPropertyValueFromPath(object baseObject, string path)
{
//Split into the base path elements
string[] pp = CorrectPathForDictionaries(path).Split(new[]{ '.' }, StringSplitOptions.RemoveEmptyEntries);
//Set initial value of the ValueObject
object valueObject = baseObject;
foreach (var prop in pp)
{
if (prop.Contains("["))
{
//Will be a dictionary. Get the name of the dictionary, and the index element of interest:
string dictionary = prop.Substring(0, prop.IndexOf("["));
int index = Convert.ToInt32(prop.Substring(prop.IndexOf("[") + 1, prop.Length - prop.IndexOf("]")));
//Get the property info for the dictionary
PropertyInfo dictInfo = valueObject.GetType().GetProperty(dictionary);
if (dictInfo != null)
{
//Get the dictionary from the PropertyInformation
valueObject = dictInfo.GetValue(valueObject, null);
//Convert it to a list to provide easy access to the item of interest. The List<> will be a set of key-value pairs.
List<object> values = ((IEnumerable)valueObject).Cast<object>().ToList();
//Use "GetValue" with the "value" parameter and the index to get the list object we want.
valueObject = values[index].GetType().GetProperty("Value").GetValue(values[index], null);
}
}
else
{
PropertyInfo propInfo = valueObject.GetType().GetProperty(prop);
if (propInfo != null)
{
valueObject = propInfo.GetValue(valueObject, null);
}
}
}
return valueObject;
}
by way: "CorrectPathForDictionaries"は単にパスをとり、シナリオ[3] .ModifiedCapacityが 'シナリオ[3] .ModifiedCapacityに変更されるように修正します。 – ainwood
何を試しましたか?試したことを明確に示す良い[mcve]と、あなたが持っている_specific_問題の正確な説明を含めてください。コンパイル時にタイプパラメータが分からないディクショナリでのリフレクションの関連メンバ(もしそうなら、正しいディクショナリタイプにオブジェクトをキャストできます)は 'Item'プロパティです。 –