注:請重新標記和/或重新命名適當傳遞函數求<T, TResult>其中TResult未知
我有一個類,,一個包裝了Foo
並實現IEnumerable<FooEnumerator>
。 Foo
表示樹形數據結構,枚舉的是當前節點的子節點。
Foo
是供應商提供的數據對象。實現了一堆自定義過濾代碼。
class FooEnumerator : IEnumerable<FooEnumerator>
{
public Foo WrappedNode { get; private set; }
public string Name { get { return WrappedNode.Name; } }
public int Id { get{ return WrappedNode.Id; } }
public DateTime Created { get{ return WrappedNode.Created; } }
public FooEnumerator(Foo wrappedNode)
{
WrappedNode = wrappedNode;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren())
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
...
}
我希望能夠以這種表達向下傳遞給每一個新的枚舉項使用排序樹與給定(任意)的表達,創建頂級時定義的每個級別,並有。
我想使用lambda來定義排序表達式,就像使用OrderBy函數一樣。實際上,我打算將lambda傳遞給OrderBy
。
用於排序依據該signiture是
OrderBy<TSource, TKey>(Func<TSource, TKey> keySelector)
其中TKey
是給定Func
的返回類型,但是在該方法中籤名的類型參數和在編譯時被計算出來。
示例用法
var x = GetStartingNode();
var sort = n => n.DateTime;
var enu = new FooEnumerator(x, sort);
var sort2 = n => n.Name;
var enu2 = new FooEnumerator(x, sort2);
排序表達式將被存儲在一個類變量和將工作等:
// pseudo-implementation
private Expression<Func<Foo, TKey>> _sortBy;
public FooEnumerator(Foo wrappedNode, Expression<Func<Foo, TKey>> sortBy)
{
WrappedNode = wrappedNode;
_sortBy = sortBy;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren().OrderBy(_sortBy))
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
如何指定TKEY的類型(隱式或顯式地)在這個用例中?
我不想硬編碼它,因爲我希望能夠對底層Foo
的任何和所有屬性進行排序。