【问题标题】:Custom nested properties/methods in asp.netasp.net 中的自定义嵌套属性/方法
【发布时间】:2010-10-02 04:28:05
【问题描述】:
我正在寻找一种方法来编写允许嵌套方法的自定义 .net 类。
例如...假设我有一个带有函数 Y 的类 X,它返回一个列表。然后我有另一个返回排序列表的函数...
我希望能够执行 x.y().z() 之类的操作,其中 z 将接受 y() 的输出作为其输入。
基本上如何将 .toLower() 或 .toUpper() 附加到任何字符串上。
我正在尝试用谷歌搜索它,但我什至不确定我问的问题是否正确。
谢谢
【问题讨论】:
标签:
asp.net
properties
class
methods
nested
【解决方案1】:
Steve 是对的(没有双关语):扩展方法就是您所要求的。在 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);
这能回答你的问题吗?
【解决方案2】:
在 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() 一样
【解决方案3】:
没有什么魔法需要发生。如果 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();
【解决方案4】:
扩展方法可能是您正在寻找的(可以接受 y() 的输出),但这取决于您使用的 .NET 版本。
所以如果你想创建一个名为 x 的扩展方法,它以 y 作为参数,你可以创建一个方法:
public static object z(input as y)
{
//do your manipulations here
}
所以如果你想让你的函数进行排序,你可以调用你的 sort 方法,传递对象 y,然后返回排序后的对象。