C# 在设计时动态返回接口
我正在尝试编写一个fluent接口,它能够在设计时检测作为Linq表达式传递的属性类型,并基于该类型的求值返回接口 例如: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)
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)
{ /* ... */ }