C# 类特定方法作为参数

C# 类特定方法作为参数,c#,generics,methods,delegates,windows-runtime,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(); } } 我很确定这是可能的,C

我的主要目标是试图理解C#是如何工作的

我想这样做:

static class MagicalClass
{
    public static List<T>   DoMagic<T>(List<T> sourceList, METHODPOINTER methodOfT)
    {
        return (list.OrderBy(obj => obj.methodOfT())).ToList();
    }
}
我很确定这是可能的,C可以评估这一点,甚至可以扣除
部分。 我想我只需要知道语法是什么,系统类涉及到什么

提前感谢您的回答。

Func
实际上是一系列带有多个参数的泛型类

思考
Func
最简单的方法如下:

  • Func
    是一种没有参数且返回类型为的方法
    TResult
  • Func
    是一种具有1个类型为T和a的参数的方法 返回
    TResult
    的类型
  • Func
    是一种具有两个类型为T和V的参数以及 返回类型为
    TResult

因此,实际上,您可以传递任何方法指针,只要它的签名是定义良好的委托。

通过使用T和泛型参数TProp,该方法可以推断用于order By的函数的列表类型和返回类型

OrderBy需要一个
Func
进行排序。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
    }
}
静态类MagicalClass
{
公共静态列表域(列表源列表,Func methodOfT)
{
return(sourceList.OrderBy(methodOfT)).ToList();
}
}
公共类
{
私有静态int id=0;
私有int currId=0;
public SomeClass(){currId=id++;}
public int doStuff(){return(currId);}
public int doOtherStuff(){return(currId+id);}
}
公共静态int-doStaticStuff(SomeClass项)
{
返回项目。doOtherStuff();
}
公共类另一类
{
public void proceedLogic()
{
列表列表=新列表();
aList.Add(newsomeclass());
aList.Add(newsomeclass());
var sortedList1=MagicalClass.DoMagic(aList,x=>x.doStuff());//为OrderBy传入Func
List sameSortedList=aList.OrderBy(x=>x.doStuff()).ToList();//也是一样
var sortedList2=MagicalClass.DoMagic(aList,doStaticStuff);//传入与预期签名匹配的函数
}
}

您是否尝试过将方法设置为静态?据我所知,Func无法将其实例限制为特定的类作用域/方法,我可以硬编码所有内容,但这不是我的目标。谢谢提醒,同时,据我所知,Func不允许我将其实例限制在特定的类范围内,然后定义一个仅用于该类的委托。但是,既然它是一个特定的接口实现,为什么还要麻烦传递这个方法呢?你知道接口,直接调用这个方法就行了?我真的很想定义一个只用于类的委托,但我似乎不知道限制它的语法。像
public delegate void SomeDelegate()
这样的东西对我不起作用。这是关于你在哪里申报的协议吗?如前所述,我希望避免使用接口解决方案,并且我真的希望避免硬编码调用。感谢您对OrderBy()期望的启发。也就是说你达到了我想要避免的点;这样做,我也看到我还不够清楚。能够建立我想要的“概念”的后果是,不可能使用“SomeClass”范围之外的任何其他方法;而且
publicstaticintdostaticstuff(SomeClass项)
不在范围之内。据我所知,在编译时无法实现这一点。我并不是说这是一个好主意,但是您可以接受类型为
Expression
的参数,如果它引用了不在您的类中的方法,则抛出异常(如果允许使用该表达式,您可以使用.Compile(),然后将该结果传递给您的OrderBy)。
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
    }
}