gpt4 book ai didi

c# - 方法返回泛型 func c#

转载 作者:行者123 更新时间:2023-11-30 20:00:22 24 4
gpt4 key购买 nike

是否可以从一个方法返回一个通用的 Func?我想要做的是类似于下面的 GetSortFunc。

public class Example
{
private List<MyObject> _objects;
public Example()
{
_objects = new List<MyObject>
{
new MyObject {Id = 1, Name = "First", Value = 100.0},
new MyObject {Id = 2, Name = "Second", Value = 49.99},
new MyObject {Id = 3, Name = "Third", Value = 149.99}
};
}

public void Sort(SomeEnum sortOptions)
{
_objects = _objects.OrderBy(GetSortFunc(sortOptions));
}

private Func<MyObject, TKey> GetSortFunc(SomeEnum sortOptions)
{
switch (sortOptions)
{
case SomeEnum.First:
return x => x.Id;
case SomeEnum.Second:
return x => x.Name;
case SomeEnum.Third:
return x => x.Value;
}
}
}

SomeEnum 和 MyObject 看起来像这样:

public enum SomeEnum
{
First,
Second,
Third
}

public class MyObject
{
public int Id { get; set; }
public string Name { get; set; }
public double Value { get; set; }
}

这是可能的还是我走错了路?

最佳答案

问题是返回类型会随着 TKey 的类型而变化。此外,OrderBy 的类型参数也会有所不同。我建议您只复制 OrderBy 调用:

IEnumerable<MyObject> ApplySortOrder(IEnumerable<MyObject> items, SomeEnum sortOptions)
{
switch (sortOptions)
{
case SomeEnum.First:
return items.OrderBy(x => x.Id);
case SomeEnum.Second:
return items.OrderBy(x => x.Name);
case SomeEnum.Third:
return items.OrderBy(x => x.Value);
}
}

或者,让 GetSortFunc 返回 delegate 并动态调用 OrderBy:

private Delegate GetSortFunc(SomeEnum sortOptions)
{
switch (sortOptions)
{
case SomeEnum.First:
return new Func<MyObject, int>(x => x.Id);
case SomeEnum.Second:
return new Func<MyObject, string>(x => x.Name);
case SomeEnum.Third:
return new Func<MyObject, int>(x => x.Value);
}
}

//...

Enumerable.OrderBy(_objects, (dynamic)GetSortFunc(sortOptions));

这将在运行时选择正确的重载。

关于c# - 方法返回泛型 func c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com