Sea*_*een 6 c# generics interface sieve.net
我正在开始研究一个名为Sieve.NET的小OSS库.
签名允许某人定义Sieve如下:
new EqualitySieve<ABusinessObject>().ForProperty(x => x.AnInt);
Run Code Online (Sandbox Code Playgroud)
这实际上返回了一个Sieve<ABusinessObject, int>,但我已尽力确保用户不必过多关心该部分.
我想找到一种方法来设置一个接口,我根本不关心属性类型 - 只是它始终是一致的.
基本上,我希望能够声明一个ISieve<TFilterObjectType>,并且能够让该接口定义如下:
ISieve<TFilterObjectType, TTypeIDontCareAbout> ForValue(TTypeIDontCareAbout);
Run Code Online (Sandbox Code Playgroud)
我的目标是能够创建一个由ISieve<ABusinessObject>和不组成的课程ISieve<ABusinessObject, int>.
我最初的研究表明没有,但我希望被证明是错的.
我真正想弄清楚的是:
EqualitySieve<ABusinessObject>().ForProperty(x=>x.AnInt).EqualitySieve<ABusinessObject, int>给用户,但由于它是一个流畅的界面我删除它们不必关心那个部分.EqualitySieve,LessThanSieve等来实现ISieve<ABusinessObject>.ISieve<ABusinessObject强制执行一项合同,我可以允许某人打电话ForValues()并期望它返回一个带有更新值的ISieve.EqualitySieve<ABusinessObject>实际上是一个EqualitySieve<ABusinessObject, int>.但我并不特别关心那时的房产类型.EqualitySieve<ABusinessObject, int>部分,我还想看看是否可以通过接口引用对象时抽象出来.IFindableSieve<ABusinessObject>理想情况下返回的ISieve<ABusinessObject>.然后我的目标是能够找到给定对象的Sieves.您可以将泛型类型参数放置在接口和接口的方法上。因此,下面的示例将定义一个通用接口,其中该F方法采用“我不关心这是什么类型,只关心它是一致的”参数之一。
interface I<T>
{
//The generic type parameter U is independent of T.
//Notice how F "forwards" the type U from input to output.
Tuple<T, U> F<U>(U u);
}
Run Code Online (Sandbox Code Playgroud)
考虑以下玩具类:
class C : I<char>
{
public char Value { get; set; }
public Tuple<char, U> F<U>(U u)
{
return Tuple.Create(Value, u);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是一些用法示例:
I<char> instance = new C { Value = '!' };
Tuple<char, int> x = instance.F(5); // ('!', 5)
Tuple<char, string> y = instance.F("apple"); // ('!', "apple")
Run Code Online (Sandbox Code Playgroud)
- 我允许用户创建一个
EqualitySieve<ABusinessObject>().ForProperty(x=>x.AnInt).- 这实际上返回
EqualitySieve<ABusinessObject, int>给用户,但由于它是一个流畅的界面,我使他们不必关心该部分。- 我想
EqualitySieve,LessThanSieve等等来实施ISieve<ABusinessObject>。
使用我上面提到的想法,您可以做(我认为)您想做的事情。
interface ISieve<T>
{
//It's still not clear what you actually want in this interface...
}
static class Sieve
{
public EqualitySieve<T> Equality<T>()
{
return new EqualitySieve<T>();
}
public LessThanSieve<T> LessThan<T>()
{
...
}
}
class EqualitySieve<T> : ISieve<T>
{
//Notice how the property type P is independent of T
//and can be inferred here from the passed expression
public EqualitySieve<T, P> ForProperty<P>(
Expression<Func<T, P>> propertyExpression)
{
return new EqualitySieve<T, P>
{
PropertyExpression = propertyExpression
};
}
}
class EqualitySieve<T, P> : ISieve<T>
{
public Expression<Func<T, P>> PropertyExpression { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用法:
//Assuming MyObject.MyProperty is an int property
//s has type EqualitySieve<MyObject, int>
var s = Sieve.Equality<MyObject>().ForProperty(x => x.MyProperty);
Run Code Online (Sandbox Code Playgroud)