Метод расширения в C # 2.0 - PullRequest
11 голосов
/ 02 апреля 2009

Какое пространство имен мне нужно, чтобы мое расширение заработало

Вот мой метод расширения


using System;
using System.Collections.Generic;
using System.Web;
using System.Data;

namespace MyUtilities
{
    public static class DataReaderExtensions
    {
        public static DataTable ToDataTable(IDataReader reader)
        {
            DataTable table = new DataTable();
            table.Load(reader);
            return table;
        }
    }
}

Когда я пытаюсь использовать его вот так

Session["Master"] = cust.GetCustomerOrderSummary((string)Session["CustomerNumber"]).ToDataTable();

это не работает. Это .net 2.0

Ответы [ 4 ]

31 голосов
/ 02 апреля 2009

Вы не можете. C # 2.0 не имеет методов расширения вообще. Вы можете использовать методы расширения из C # 3.0 в Visual Studio 2008 для таргетинга .NET 2.0, как описано в моей статье "C # /. NET версии" , но вы не можете убедить компилятор C # 2.0 действовать так, как будто он понимает, что такое методы расширения.

25 голосов
/ 02 апреля 2009

Теги говорят .NET 2.0; Если вы используете C # 3.0 (то есть VS 2008) и ориентируетесь на .NET 2.0, вы можете сделать это, объявив ExtensionAttribute - или (проще) просто указав LINQBridge .

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class |
        AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute { }
}

При этом методы расширения будут работать в .NET 2.0 с C # 3.0.

2 голосов
/ 02 апреля 2009

Как сказал JS, в C # 2.0 нет методов расширения.

Также этот метод расширения будет определен как:

public static DataTable ToDataTable(this IDataReader reader)

Попробуйте назвать это как:

DataReaderExtensions.ToDataTable(
   cust.GetCustomerOrderSummary((string)Session["CustomerNumber"])
   )
2 голосов
/ 02 апреля 2009

Методы расширения не будут работать в C # 2, потому что они зависят от компилятора C # 3. Компилятор C # 3 знает, как сделать перевод из этого:

foo.Bar()

к этому:

ExtensionClass.Bar(foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...