3

T をインターフェイス タイプとして渡すことができるジェネリック メソッドが 1 つあります。メソッドは、T 型に対応するデータのリストを返します。このメソッドには 20 ~ 25 の同じ条件があり、ロジックを最適化するにはどうすればよいですか。

クラスはインターフェースを実装します。example Student クラスは IStudent インターフェイスを実装しています。

public ObservableCollection<T> GetAll<T>()
    {
        try
        {
            if (typeof(T) == typeof(IStudent))
            {                 
                return GetAll<T, Student>();
            }
            else if (typeof(T) == typeof(IZone))
            {
                return GetAll<T, Zone>();
            }
            else if (typeof(T) == typeof(IEmployee))
            {
                return GetAll<T, Employee>();
            }
            else if (typeof(T) == typeof(ICourse))
            {
                return GetAll<T, Course>();
            }
         }
    }

ここで、呼び出し元はインターフェイスの型 T を渡し、T の型をチェックします。他の関数 T と T のリストを返すクラスに渡します。基本クラスの他の関数は変更できません。誰かが私に同じことを提案できますか?

4

2 に答える 2

5

ジェネリックはまったく必要ないと思います。すべてのタイプで実装される共通のインターフェイスを作成できます。

public interface IObservableElement
{
    public ObservableCollection<IObservableElement> GetAll();
}
于 2012-12-04T12:46:51.800 に答える
2

リフレクションを通じてこれを試すことができます。

public ObservableCollection<T> GetAll<T>()
{
    var typeName = typeof(T).FullName;
    var indexOfDot = typeName.LastIndexOf('.');
    var newTypeName = typeName.SubString(0, indexOfDot) + '.' + typeName.SubString(indexOfDot + 1);
    var newType = Type.GetType(newTypeName);
    var methodTypes = new [] { typeof(T), newType };
    var method = GetType().GetMethod("GetAll");
    var typedMethod = method.MakeGenericMethod(methodTypes);
    return (ObservableCollection<T>) typedMethod.Invoke(this, new object[0]);
}

きれいではありませんが、仕事をする必要があり、一般的にはそうです。

現在の方法の唯一の注意点は、GetAllメソッドがジェネリック パラメーターによってオーバーロードされているため、正しいメソッドを取得できないか、2 つあるために失敗する可能性があることです。正しいものが示されているかどうかを確認します。

于 2012-12-04T12:56:10.313 に答える