Пользовательские вложенные свойства / методы в asp.net - PullRequest
1 голос
/ 19 января 2009

Я ищу способ написать собственный класс .net, который бы позволял использовать вложенные методы.

Например ... скажем, у меня есть класс X с функцией Y, которая возвращает список. Тогда у меня есть другая функция, которая возвращает отсортированный список ...

Я хотел бы иметь возможность сделать что-то вроде x.y (). Z (), где z примет вывод y () в качестве ввода.

В основном, как .toLower () или .toUpper () можно привязать к любой строке.

Я пытаюсь погуглить, но даже не уверен, что задаю правильный вопрос.

Спасибо

Ответы [ 4 ]

1 голос
/ 19 января 2009

Методы расширения могут быть тем, что вы ищете (могут принимать выходные данные y ()), но это зависит от используемой вами версии .NET.

поэтому, если вы хотите создать метод расширения с именем x, который принимает y в качестве параметра, вы должны создать метод:

public static object z(input as y)
{
    //do your manipulations here
}

поэтому, если вы хотите, чтобы ваша функция выполняла сортировку, вы бы вызвали метод сортировки, передали объект y и вернули отсортированный объект.

0 голосов
/ 17 декабря 2009

Стив прав (не каламбур): методы расширения - это то, что вы просите. В 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);

Есть несколько дополнительных вещей, которые вы можете сделать, используя лямбда-выражения, чтобы избежать необходимости писать собственный класс сравнения в определенных случаях и так далее. Однако, прежде чем вы заново изобретаете колесо, я бы посоветовал вам взглянуть на LINQ to Objects, в который уже встроено множество этих функций. Например:

using System.Linq;
...
IEnumerable<Book> booksInOrder1 = GetBookList().OrderBy(b => b.Title);

Это отвечает на ваш вопрос?

0 голосов
/ 19 января 2009

В 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 ()

0 голосов
/ 19 января 2009

Нет ничего волшебного, что должно произойти. Если в классе 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();

...