【问题标题】:Optimize Generic Method logic优化通用方法逻辑
【发布时间】:2012-12-04 12:43:49
【问题描述】:

我有一个通用方法,我们可以将 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 列表的类。基类中的其他函数,我无法更改。 谁能给我一些相同的建议。

【问题讨论】:

  • 这个逻辑不是完全违背了泛型的观点吗?

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


【解决方案1】:

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

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

【讨论】:

  • 这里调用者传递接口类型,我检查 T 的类型。我传递给其他函数 T 和类,它将返回 T 列表。基类中的其他函数,我无法更改。
  • 如果您不能基于通用更改设计,René Wolferink 建议的反射应该是最好的问题
【解决方案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 方法被泛型参数重载,因此它可能无法为您提供正确的方法,或者因为有两个方法而失败。我看看能不能指点下合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2012-08-10
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多