我正在寻找一种方法来编写一个允许嵌套方法的自定义.net类。
例如...说我有一个带有函数Y的类X,它返回一个列表。然后我有另一个函数返回一个排序列表......
我希望能够执行类似x.y()。z()的操作,其中z将接受y()的输出作为其输入。
基本上如何将.toLower()或.toUpper()添加到任何字符串上。
我正试图谷歌但我甚至不确定我是否在问正确的问题。
由于
答案 0 :(得分:1)
扩展方法可能是您正在寻找的(可以接受y()的输出),但这取决于您使用的.NET版本。
所以如果你想创建一个名为x的扩展方法,它将y作为参数,你可以创建一个方法:
public static object z(input as y)
{
//do your manipulations here
}
所以如果你想让你的函数进行排序,你可以调用你的sort方法,传递对象y,并返回被排序的对象。
答案 1 :(得分: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();
答案 2 :(得分:0)
在asp.net vb中,您可以使用Module而不是像这样的类:
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()
相同。答案 3 :(得分: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);
这会回答你的问题吗?