リフレクションを使用して、継承されたクラスではなく、基本クラスのプロパティを取得する方法を教えてください。リフレクションを使用してクラスを継承しない基本クラスのプロパティのみを取得する
私の基本クラスには仮想メソッドがあり、それを継承するクラスがそれをオーバーライドするとします。オーバーライドがbase.MyMethod()を呼び出す場合、base.MyMethod()内のリフレクションは、BindingFlagsが使用されているかどうかに応じて、両方のクラスまたは継承するクラスからプロパティを取得します。
基本クラスのプロパティにしかアクセスできない方法はありますか?
編集:私がこれをやりたい理由を説明するコードがあるかもしれません。
internal static void Save(DataTransactionAccess data, string sproc, object obj)
{
if (checkMandatoryProperties(obj))
{
saveToDatabase(data, sproc, obj);
}
}
private static void saveToDatabase(DataTransactionAccess data, string sproc, object obj)
{
List<object> paramList;
PropertyInfo idProperty;
populateSaveParams(out paramList, out idProperty, obj);
if (idProperty != null)
{
int id = data.ExecuteINTProcedure(sproc, paramList.ToArray());
idProperty.SetValue(obj, id, null);
}
else
{
data.ExecuteProcedure(sproc, paramList.ToArray());
}
}
private static void populateSaveParams(out List<object> paramList, out PropertyInfo idProperty, object obj)
{
paramList = new List<object>();
idProperty = null;
foreach (PropertyInfo info in obj.GetType().GetProperties())
{
if (info.GetCustomAttributes(typeof(SaveProperty), true).Length > 0)
{
paramList.Add("@" + info.Name);
paramList.Add(info.GetValue(obj, null));
}
if (info.GetCustomAttributes(typeof(SaveReturnIDProperty), true).Length > 0)
{
idProperty = info;
}
}
}
それは私が保存が呼び出されたOBJ内のクラスのプロパティではなく、任意のそれはから継承したクラスまたはその子クラスのいずれかを取得する必要がありますpopulateSaveParamsでforeachループ内にあります。
これがこれをより明確にします。
値を調べるときに 'GetType'または' typeof(BaseClass) 'を使用していますか?私は後者がちょうどあなたのbaseclass値を得ると思います。 – Tejs
これはtypeof(BaseClass)を使用できません。これはインターフェイスへの拡張メソッドであるため、実行時にGetType()を使用して基底クラスを決定する必要があります。 – GlenW
拡張メソッドが基本クラスを気にするのはなぜですか?あなたの拡張メソッドが広すぎるように聞こえる。 – Tejs