ジェネリックを使用して、単一の拡張メソッドの背後に一連のレガシー メソッド全体を隠そうとしています。これらの従来のメソッドはすべて GetValidXXX と呼ばれ、同様の署名を持っています (もちろん、実際にはrefではなくoutである必要があります)。下位互換性のために古い GetValidXXX を保持する必要があります。
public static T GetAttributeValue<T>(this DbElement element, DbAttribute attribute, T defaultValue)
{
T result = default(T);
if (typeof(T) == typeof(DbAttribute))
{
if (element.GetValidAttribute(attribute, ref result)) return result;
}
else if (typeof(T) == typeof(bool))
{
if (element.GetValidBool(attribute, ref result)) return result;
}
return defaultValue;
}
結果が特定の GetValidXXX シグネチャの型と一致しないため、これはコンパイルされません (戻り値は成功/失敗です)。
bool GetValidAttribute(DbAttribute attribute, ref DbAttribute result)
bool GetValidBool(DbAttribute attribute, ref bool result)
etc
私が目指していることを達成するためにこれをどのように書くことができますか。つまり、次のようなコードを書くことができます:
string description = element.GetAttributeValue(DbAttributeInstance.DESC, "unset");
bool isWritable = !element.GetAttributeValue(DbAttributeInstance.READONLY, true);