反射を使用して、別のオブジェクトの配列を含むオブジェクトのプロパティを読み取ります
-
28-10-2019 - |
質問
C#の反射を使用して、配列タイプの要素を含むオブジェクトのプロパティを読むにはどうすればよいですか。 getMyPropertiesというメソッドがあり、オブジェクトがカスタムタイプであると判断した場合、アレイのプロパティと内部の値をどのように読み取ることができますか。 iSCustomTypeは、タイプがカスタムタイプかどうかを判断する方法です。
public void GetMyProperties(object obj)
{
foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
{
if (!Helper.IsCustomType(pinfo.PropertyType))
{
string s = pinfo.GetValue(obj, null).ToString();
propArray.Add(s);
}
else
{
object o = pinfo.GetValue(obj, null);
GetMyProperties(o);
}
}
}
シナリオには、ArrayClassのオブジェクトがあり、ArrayClassには2つのプロパティがあります。
-string Id
-DeptArray[] depts
Deptarrayは、2つのプロパティを持つ別のクラスです。
-string code
-string value
したがって、この方法はArrayClassのオブジェクトを取得します。すべてのプロパティを辞書/リスト項目で上から底からボトムへ、名前/バリューペアを保存します。私は価値、カスタム、列挙タイプのためにそれを行うことができます。オブジェクトの配列で立ち往生しました。それを行う方法がわかりません。
解決
このコードを試してください:
public static void GetMyProperties(object obj)
{
foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
{
var getMethod = pinfo.GetGetMethod();
if (getMethod.ReturnType.IsArray)
{
var arrayObject = getMethod.Invoke(obj, null);
foreach (object element in (Array) arrayObject)
{
foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
{
Console.WriteLine(arrayObjPinfo.Name + ":" + arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString());
}
}
}
}
}
このコードをテストしましたが、反射を介してアレイを正しく解決します。
他のヒント
プロパティ値オブジェクトを取得してから、getType()を呼び出す必要があります。その後、このようなことができます。
var type = pinfo.GetGetMethod().Invoke(obj, new object[0]).GetType();
if (type.IsArray)
{
Array a = (Array)obj;
foreach (object arrayVal in a)
{
// reflect on arrayVal now
var elementType = arrayVal.GetType();
}
}
参考までに、このコードを再帰オブジェクトフォーマットメソッドから引き出しました(今すぐJSONシリアル化を使用します)。
所属していません StackOverflow