我正在尝试编写一个流畅的接口,该接口能够在设计时检测作为 Linq 表达式传递的属性类型,并根据对该类型的评估返回一个接口。
例如:
public class Searchable<Person>
{
public Searchable()
{
CanSearch(x => x.Name)
.Include(StringOperations.Contains);
CanSearch(x => x.Age)
.Exclude(NumericOperators.GreaterThan);
}
}
在 CanSearchMethod 中,我希望能够执行以下操作:
public IOperations CanSearch(Expression<Func<T, object>> expression)
{
var type = (/* Code to pick apart expression */);
if(type == typeof(int))
return new ClassImplementingINumericOperations();
if(type == typeof(string))
return new ClassImplementingIStringOperations();
if(type == typeof(IEnumerable))
return new ClassImplementingIIEnumerableOperations();
return null;
}
不同接口的 Include 和 Exclude 方法的区别仅在于作为参数接受的枚举:
public interface IOperations
{
}
public interface INumericOperations : IOperations
{
INumericOperations Include(NumericOperationsEnum op);
INumericOperations Exclude(NumericOperationsEnum op);
}
public interface IStringOperations : IOperations
{
IStringOperations Include(StringOperationsEnum op);
IStringOperations Exclude(StringOperationsEnum op);
}
public interface IIEnumerableOperations : IOperations
{
IIEnumerableOperations Include(CollectionOperationsEnum op);
IIEnumerableOperations Exclude(CollectionOperationsEnum op);
}
我怀疑这是不可能的,但我不能完全解决,因为动态可以做一些时髦的魔法。
我查看了其他一些流畅的接口,但似乎没有一个评估表达式以确定在设计时返回什么类型。