0

ジェネリックを使用して、単一の拡張メソッドの背後に一連のレガシー メソッド全体を隠そうとしています。これらの従来のメソッドはすべて 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);
4

2 に答える 2

1

Convert.ChangeType()あなたの場合に役立つかもしれません。

可能な使用法:

    public static T ConvertTypeOrGetDefault<T>(this object value, T defaultValue)
    {
        try
        {
            return (T)Convert.ChangeType(value, typeof(T));
        }
        catch (Exception ex)
        {
            return default(T);
        }
    }

それは、あなたがどれだけ「ハッキー」になりたいかによって異なります。従来のメソッドを非表示にする必要がないように、リファクタリングを検討することもできます。

于 2013-09-03T11:48:04.867 に答える