asp.net中的自定义嵌套属性/方法

时间:2009-01-19 06:34:30

标签: asp.net properties class methods nested

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

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

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

基本上如何将.toLower()或.toUpper()添加到任何字符串上。

我正试图谷歌但我甚至不确定我是否在问正确的问题。

由于

4 个答案:

答案 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);

这会回答你的问题吗?