优化通用方法逻辑

时间:2012-12-04 12:43:50

标签: c# class c#-4.0 logic generic-method

我有一个通用方法,我们可以将T作为接口类型传递。方法返回对应T类型的数据列表。我对此方法有20-25条相同的条件,我该如何优化逻辑。

类实现接口。示例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和I检查T的类型。我传递给其他函数T和将返回T的列表的类。我不能改变的基类中的其他函数。 任何人都可以向我提出相同的建议。

2 个答案:

答案 0 :(得分:5)

我认为你根本不需要通用,你可以创建一个由你所有类型实现的通用界面:

public interface IObservableElement
{
    public ObservableCollection<IObservableElement> GetAll();
}

答案 1 :(得分: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方法被泛型参数重载,因此它可能无法使您获得正确的方法,或者因为有两个方法而失败。如果可以指出正确的那个,我会看看。