1

我正在寻找一种方法来编写允许嵌套方法的自定义 .net 类。

例如...假设我有一个类 X,其函数 Y 返回一个列表。然后我有另一个返回排序列表的函数......

我希望能够执行类似 xy().z() 的操作,其中 z 将接受 y() 的输出作为其输入。

基本上如何 .toLower() 或 .toUpper() 可以附加到任何字符串上。

我正在尝试用谷歌搜索它,但我什至不确定我是否在问正确的问题。

谢谢

4

4 回答 4

1

扩展方法可能是您正在寻找的(可以接受 y() 的输出),但这取决于您使用的 .NET 版本。

因此,如果您想创建一个名为 x 并以 y 作为参数的扩展方法,您将创建一个方法:

public static object z(input as y)
{
    //do your manipulations here
}

因此,如果您希望您的函数进行排序,您将调用您的排序方法,传递对象 y,然后返回已排序的对象。

于 2009-01-19T06:41:30.027 回答
0

史蒂夫是对的(没有双关语):扩展方法就是您所要求的。在 C# 中,你会做这样的事情:

namespace ExtensionsNamespace; // Name this whatever you want.
public static class ListExtensions // must be public static!
{
    // must be public static and the first parameter needs a "this"
    public static IList<T> ToOrderedList<T>(this IList<T> originalList, IComparer<T> comparer)
    {
        // Code to take the original list and return an ordered version
    }
}

然后在您的代码中:

using ExtensionsNamespace;
...
IComparer<Book> comparer = GetBookComparer();
IList<BooK> books = GetBookList().ToOrderedList(comparer);

您可以使用 lambda 表达式做一些额外的事情,以避免在某些情况下需要编写自己的比较器类,等等。但是,在您重新发明轮子之前,我建议您查看 LINQ to Objects,它已经内置了很多这些功能。例如:

using System.Linq;
...
IEnumerable<Book> booksInOrder1 = GetBookList().OrderBy(b => b.Title);

这是否回答你的问题?

于 2009-12-17T00:14:54.137 回答
0

在 asp.net vb 中,您可以使用模块而不是像这样的类:

    Imports System.Runtime.CompilerServices
    Public Module Extensions
       <Extension()> _
       Public Function extendedMethod(ByRef input As String) As String
           Return input & "extended method"
       End Function
    End Module

然后在你后面的代码中导入它,就像你导入任何类一样:

    Imports Extensions
    Partial Class _Default
    Inherits System.Web.UI.Page
       Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim st As String = "a string "
        Response.Write(st.ToUpper.extendedMethod)
       End Sub
    End Class

在这种情况下,您可以对任何字符串值使用模块中的“extendedMethod”方法,就像使用 .toUpper() 或 .toLower() 一样

于 2009-01-19T20:30:03.443 回答
0

没有什么魔法需要发生。如果 A 类有一个返回 B 类对象的方法,那么您可以直接在 A 中的函数上调用方法。

鉴于:

public static class MyClass     
{
  public MyList getList()
  {
    MyList retVal = new MyList();
    ...
    return retVal;
  }
}

public class MyList
{
    public MyList sort()
    {
        // Sort list
        ...
        return sortedList;
    }
}

那么这是合法的: MyList list = MyClass.getList().sort();

于 2009-01-19T09:27:05.980 回答