特定于类的方法作为参数

时间:2015-01-06 09:47:02

标签: c# generics methods delegates windows-runtime

我的主要目标是尝试了解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>部分。 我想我只需要知道什么是语法以及涉及的系统类。

提前感谢您的回答。

2 个答案:

答案 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
    }
}