我正在寻找一种方法来编写允许嵌套方法的自定义 .net 类。
例如...假设我有一个类 X,其函数 Y 返回一个列表。然后我有另一个返回排序列表的函数......
我希望能够执行类似 xy().z() 的操作,其中 z 将接受 y() 的输出作为其输入。
基本上如何 .toLower() 或 .toUpper() 可以附加到任何字符串上。
我正在尝试用谷歌搜索它,但我什至不确定我是否在问正确的问题。
谢谢
我正在寻找一种方法来编写允许嵌套方法的自定义 .net 类。
例如...假设我有一个类 X,其函数 Y 返回一个列表。然后我有另一个返回排序列表的函数......
我希望能够执行类似 xy().z() 的操作,其中 z 将接受 y() 的输出作为其输入。
基本上如何 .toLower() 或 .toUpper() 可以附加到任何字符串上。
我正在尝试用谷歌搜索它,但我什至不确定我是否在问正确的问题。
谢谢
扩展方法可能是您正在寻找的(可以接受 y() 的输出),但这取决于您使用的 .NET 版本。
因此,如果您想创建一个名为 x 并以 y 作为参数的扩展方法,您将创建一个方法:
public static object z(input as y)
{
//do your manipulations here
}
因此,如果您希望您的函数进行排序,您将调用您的排序方法,传递对象 y,然后返回已排序的对象。
史蒂夫是对的(没有双关语):扩展方法就是您所要求的。在 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);
这是否回答你的问题?
在 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() 一样
没有什么魔法需要发生。如果 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();