0

私はこのクラスとインターフェースを持っています:

public class XContainer
{
    public List<IXAttribute> Attributes { get; set; }
}

public interface IXAttribute
{
    string Name { get; set; }
}

public interface IXAttribute<T> : IXAttribute
{
    T Value { get; set; }
}

public class XAttribute<T> : IXAttribute<T>
{
    public T Value { get; set; }
}

繰り返して XContainer.Attributesプロパティを取得する必要がありますが、またはのようなジェネリック表現を修正Valueするためにキャストする必要がありますが、if-elseif-elseステートメントを使用してifthenキャストのようにチェックしたくありません...IXAttributeXAttribute<string>XAttribute<int>XContainerl.Attributes[0] is XAttribute<string>

ここにそれを行うためのより良い方法がありますか?

4

2 に答える 2

1

それを行うより良い方法があります。

現在の全体的な設計を維持したい場合、非ジェネリック インターフェイスと実装を次のように変更できます。

public interface IXAttribute
{
    string Name { get; set; }
    object GetValue();
}

public class XAttribute<T> : IXAttribute<T>
{
    public T Value { get; set; }

    public object GetValue()
    {
       return Value;
    }
}

次に、イテレータは にアクセスするだけGetValue()で、キャストは必要ありません。

とはいえ、デザインはあなたがしていることに最適ではないかもしれないと思います.

于 2012-06-02T15:01:51.980 に答える
0

汎用拡張メソッドを定義することもできます

public static class XAttributeExtensions
{
    public T GetValueOrDefault<T>(this IXAttribute attr)
    {        
        var typedAttr = attr as IXAttribute<T>;
        if (typedAttr == null) {
            return default(T);
        }
        return typedAttr.Value;
    }
}

それからあなたはそれを呼び出すことができます(であると仮定しTますint

int value = myAttr.GetValueOrDefault<int>();

これを拡張メソッドとして実装する理由は、非ジェネリック インターフェイスの任意の実装で機能するためIXAttributeです。

于 2012-06-02T15:20:10.683 に答える