【发布时间】:2018-11-20 21:54:27
【问题描述】:
我正在创建使用抽象泛型类作为基础的代码。我有点卡住了,因为我试图创建将根据插入的对象类型返回特定对象的工厂。
假设我想与对象进行比较以检查它们是否相等。在我的场景中,如果它们是IEnumerable 或IList 的类型,我想以这种方式比较对象
我的代码:
界面:
public interface IObjectComparer<in T>
{
bool Compare(T obj1, T obj2);
}
基类:
public abstract class ObjectComparerBase<T> : IObjectComparer<T>
{
public abstract bool Compare(T obj1, T obj2);
public void SomeUsefullHelperMethod()
{
}
}
IList 对象比较器:
public sealed class ListObjectComparer : ObjectComparerBase<IList>
{
public override bool Compare(IList obj1, IList obj2)
{
throw new NotImplementedException();
}
}
和IEnumerable对象比较器
public sealed class EnumerableObjectComparer : ObjectComparerBase<IEnumerable>
{
public override bool Compare(IEnumerable obj1, IEnumerable obj2)
{
throw new System.NotImplementedException();
}
}
最后我的工厂应该决定是否需要为某个对象使用哪个比较器:
public sealed class ComparerRetriever
{
public static IObjectComparer<T> Retrieve<T>(T obj)
{
IObjectComparer<T> comparer = null;
switch (typeof(T))
{
case IEnumerable o:
{
comparer = new EnumerableObjectComparer();
break;
}
case IList o:
{
comparer = new ListObjectComparer();
break;
}
default:
throw new NotSupportedException("Not Supported Type");
}
return comparer;
}
}
我的问题:
在当前情况下,我不能使用我的 ComparerRetriever 类,因为编译器说下界 ListObjectComparer 和 EnumerableObjectComparer 不是 IObjectComparer<T> 类型。
我的问题是为什么?我的对象有 ObjectComparerBase<T> 类作为父类,而这个类正在实现 IObjectComparer<T> 所以在我看来 EnumerableObjectComparer 和 ListObjectComparer 应该是 ObjectComparerBase<T> 的类型
可能我遗漏了一些东西,但此时我看不到什么。
你能帮帮我吗?
谢谢。
【问题讨论】:
-
不幸的是,编译器不理解
T、case的类型和您构造的类型之间的联系。假设类型确实匹配,构造和返回它们的唯一方法是执行return (IObjectComparer<T>)(object)new EnumerableObjectComparer();(我相信object的中间转换是必要的,但不要尝试) -
这个演员阵容在这种情况下很有帮助。我也需要这个中期演员。我认为这是一个很好的答案。也许这个演员的代码看起来不是最好的,但至少我直到编译。