asp.net中的自定义嵌套属性/方法
我正在寻找一种方法来编写一个允许嵌套方法的自定义.net类 例如。。。假设我有一个类X和一个返回列表的函数Y。然后我有另一个函数返回一个排序列表 我希望能够像x.y().z()这样做,其中z将接受y()的输出作为其输入 基本上,可以将.toLower()或.toUpper()附加到任何字符串上 我试图用谷歌搜索它,但我甚至不确定我问的问题是否正确asp.net中的自定义嵌套属性/方法,asp.net,properties,class,methods,nested,Asp.net,Properties,Class,Methods,Nested,我正在寻找一种方法来编写一个允许嵌套方法的自定义.net类 例如。。。假设我有一个类X和一个返回列表的函数Y。然后我有另一个函数返回一个排序列表 我希望能够像x.y().z()这样做,其中z将接受y()的输出作为其输入 基本上,可以将.toLower()或.toUpper()附加到任何字符串上 我试图用谷歌搜索它,但我甚至不确定我问的问题是否正确 谢谢您可能正在寻找扩展方法(可以接受y()的输出),但这取决于您使用的.NET版本 因此,如果您想创建一个名为x的扩展方法,该方法以y为参数,您可以创
谢谢您可能正在寻找扩展方法(可以接受y()的输出),但这取决于您使用的.NET版本 因此,如果您想创建一个名为x的扩展方法,该方法以y为参数,您可以创建一个方法:
public static object z(input as y)
{
//do your manipulations here
}
因此,如果希望函数进行排序,可以调用sort方法,传递对象y,然后返回已排序的对象。扩展方法可能是您要查找的(可以接受y()的输出),但这取决于您使用的.NET版本 因此,如果您想创建一个名为x的扩展方法,该方法以y为参数,您可以创建一个方法:
public static object z(input as y)
{
//do your manipulations here
}
因此,如果希望函数进行排序,可以调用sort方法,传递对象y,然后返回已排序的对象。没有什么神奇的事情需要发生。如果类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()代码>没有什么神奇的事情需要发生。如果类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()代码>在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
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
}
}
在这种情况下,您可以对任何字符串值使用模块中的“extendedMethod”方法,方法与在asp.net vb中使用.toUpper()或.toLower()的方法相同。您可以使用模块,而不是像这样的类:
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
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
}
}
在这种情况下,您可以对任何字符串值使用模块中的“extendedMethod”方法,方法与使用.toUpper()或.toLower()的方法相同。Steve是对的(没有双关语):扩展方法就是您所要求的。在C#中,您可以这样做:
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
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
}
}
名称空间扩展名称空间;//随便你叫什么名字都行。
public static类ListExtensions//必须是public static!
{
//必须是public static,并且第一个参数需要一个“this”
公共静态IList ToOrderedList(此IList原始列表、IComparer比较器)
{
//获取原始列表并返回有序版本的代码
}
}
然后在代码中:
using ExtensionsNamespace;
...
IComparer<Book> comparer = GetBookComparer();
IList<BooK> books = GetBookList().ToOrderedList(comparer);
使用扩展名称空间;
...
IComparer comparer=GetBookComparer();
IList books=GetBookList().ToOrderedList(比较器);
在某些情况下,您可以使用lambda表达式做一些额外的事情,以避免编写自己的比较器类,等等。然而,在你重新发明轮子之前,我建议你看看LINQtoObjects,它已经内置了很多这样的功能。例如:
using System.Linq;
...
IEnumerable<Book> booksInOrder1 = GetBookList().OrderBy(b => b.Title);
使用System.Linq;
...
IEnumerable booksInOrder1=GetBookList().OrderBy(b=>b.Title);
这回答了你的问题吗?史蒂夫是对的(没有双关语):扩展方法就是你想要的。在C#中,您可以这样做:
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
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
}
}
名称空间扩展名称空间;//随便你叫什么名字都行。
public static类ListExtensions//必须是public static!
{
//必须是public static,并且第一个参数需要一个“this”
公共静态IList ToOrderedList(此IList原始列表、IComparer比较器)
{
//获取原始列表并返回有序版本的代码
}
}
然后在代码中:
using ExtensionsNamespace;
...
IComparer<Book> comparer = GetBookComparer();
IList<BooK> books = GetBookList().ToOrderedList(comparer);
使用扩展名称空间;
...
IComparer comparer=GetBookComparer();
IList books=GetBookList().ToOrderedList(比较器);
在某些情况下,您可以使用lambda表达式做一些额外的事情,以避免编写自己的比较器类,等等。然而,在你重新发明轮子之前,我建议你看看LINQtoObjects,它已经内置了很多这样的功能。例如:
using System.Linq;
...
IEnumerable<Book> booksInOrder1 = GetBookList().OrderBy(b => b.Title);
使用System.Linq;
...
IEnumerable booksInOrder1=GetBookList().OrderBy(b=>b.Title);
这回答了你的问题吗