【问题标题】: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,然后返回排序后的对象。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-10
            • 2011-04-17
            • 2019-08-02
            相关资源
            最近更新 更多