C# 在设计时动态返回接口

C# 在设计时动态返回接口,c#,dynamic,fluent-interface,C#,Dynamic,Fluent Interface,我正在尝试编写一个fluent接口,它能够在设计时检测作为Linq表达式传递的属性类型,并基于该类型的求值返回接口 例如: public class Searchable<Person> { public Searchable() { CanSearch(x => x.Name) .Include(StringOperations.Contains); CanSearch(x => x.Age)

我正在尝试编写一个fluent接口,它能够在设计时检测作为Linq表达式传递的属性类型,并基于该类型的求值返回接口

例如:

public class Searchable<Person>
{
    public Searchable()
    {
        CanSearch(x => x.Name)
            .Include(StringOperations.Contains);

        CanSearch(x => x.Age)
            .Exclude(NumericOperators.GreaterThan);
    }
}
我怀疑这是不可能的,但我不能完全解决它,因为动力学可以做一些时髦的魔术


我看过其他一些fluent接口,但似乎没有一个对表达式求值,以确定在设计时返回哪些类型。

您可以通过使用重载的编译时类型安全性来实现这一点:

public IStringOperations CanSearch<T>(Expression<Func<T, string>> expression);
public IIEnumerableOperations<TItem> CanSearch<T, TItem>(Expression<Func<T, IEnumerable<TItem>> expression);
公共IStringOperations可以搜索(表达式);

public IIEnumerableOperations CanSearch(Expression您可以利用重载和类型推断。类似如下:

IStringOperations CanSearch(
    Expression<Func<T, string>> expression)
{ /* ... */ }

INumericOperations CanSearch<TCompare>(
    Expression<Func<T, TCompare>> expression)
    where TCompare : IComparable<TCompare>
{ /* ... */ }

IIEnumerableOperations CanSearch<TSeq>(
    Expression<Func<T, IEnumerable<TSeq>>> expression)
{ /* ... */ }
IStringOperations可以搜索(
表达式(表达式)
{ /* ... */ }
用显微镜检查(
表达式(表达式)
其中t比较:i可比较
{ /* ... */ }
IIEnumerableOperations可搜索(
表达式(表达式)
{ /* ... */ }

现在,
CanSearch(x=>x.Name)
将返回一个
IStringOperations
,而
CanSearch(x=>x.Age)
将返回一个
INumericOperations
对象。

我将尝试一下。谢谢!
public IStringOperations CanSearch<T>(Expression<Func<T, string>> expression);
public IIEnumerableOperations<TItem> CanSearch<T, TItem>(Expression<Func<T, IEnumerable<TItem>> expression);
IStringOperations CanSearch(
    Expression<Func<T, string>> expression)
{ /* ... */ }

INumericOperations CanSearch<TCompare>(
    Expression<Func<T, TCompare>> expression)
    where TCompare : IComparable<TCompare>
{ /* ... */ }

IIEnumerableOperations CanSearch<TSeq>(
    Expression<Func<T, IEnumerable<TSeq>>> expression)
{ /* ... */ }