3

我有一个通用方法,我们可以将 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 并检查 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方法被泛型参数重载,因此它可能无法为您提供正确的方法,或者因为有两个方法而失败。我会看看是否可以指出正确的。

于 2012-12-04T12:56:10.313 回答