我的主要目标是尝试了解C#的工作原理。
我想做这样的事情:
static class MagicalClass
{
public static List<T> DoMagic<T>(List<T> sourceList, METHODPOINTER methodOfT)
{
return (list.OrderBy(obj => obj.methodOfT())).ToList();
}
}
如果我的主要目标(如上所述)无法达到,我可以负担得起像添加List<T> DoMagic<T>(List<T> sourceList, METHODPOINTER methodOfT) where T : SomeInterface
这样的事情。
我需要将METHODPOINTER
替换为Func<T>
之类的内容,但特定于某个类
例如:
class SomeClass
{
private static int id = 0;
private int currId = 0;
SomeClass() { currId = id++; }
public int doStuff() { return (currId); }
public int doOtherStuff() { return (currId + id); }
}
class AnotherClass
{
String proceedLogic()
{
List<SomeClass> aList = new List<SomeClass>();
aList.Add(new SomeClass());
aList.Add(new SomeClass());
var sortedList = MagicalClass.DoMagic<SomeClass>(aList, SomeClass.doStuff); // this is my goal
List<SomeClass> sameSortedList = aList.OrderBy(x => x.doStuff()).ToList(); // would be the same thing
}
}
我很确定这是可能的,C#可以对此进行评估,甚至可以扣除<SomeClass>
部分。
我想我只需要知道什么是语法以及涉及的系统类。
提前感谢您的回答。
答案 0 :(得分:1)
Func<T>
实际上是一系列具有许多参数的泛型类。
考虑Func<T>
的最简单方法如下:
Func<TResult>
是一个没有参数且返回类型为的方法
TResult
。Func<T, TResult>
是一个带有1个T类型参数和a的方法
返回类型TResult
。Func<T,V,TResult>
是一个带有2个T和V型参数的方法
返回类型为TResult
。所以实际上,你可以传递任何方法指针,只要它的签名是一个定义良好的委托。
答案 1 :(得分:0)
通过使用T和泛型参数TProp,该方法可以推断出用于订单的函数的列表类型和返回类型。
OrderBy希望Func<SomeClass,???>
能够排序。 TProp提供???类型。
我还包含了一个doStaticStuff方法,因此如果您的方法已经与预期的签名匹配,您可以看到它是如何工作的。
static class MagicalClass
{
public static List<T> DoMagic<T, TProp>(List<T> sourceList, Func<T, TProp> methodOfT)
{
return (sourceList.OrderBy(methodOfT)).ToList();
}
}
public class SomeClass
{
private static int id = 0;
private int currId = 0;
public SomeClass() { currId = id++; }
public int doStuff() { return (currId); }
public int doOtherStuff() { return (currId + id); }
}
public static int doStaticStuff(SomeClass item)
{
return item.doOtherStuff();
}
public class AnotherClass
{
public void proceedLogic()
{
List<SomeClass> aList = new List<SomeClass>();
aList.Add(new SomeClass());
aList.Add(new SomeClass());
var sortedList1 = MagicalClass.DoMagic(aList, x => x.doStuff()); // pass in a Func<SomeClass,int> for OrderBy
List<SomeClass> sameSortedList = aList.OrderBy(x => x.doStuff()).ToList(); // would be the same thing
var sortedList2 = MagicalClass.DoMagic(aList, doStaticStuff); // pass in a function that matches the expected signature
}
}