Метод расширения в С# 2.0

В каком пространстве имен мне нужно заставить мое расширение работать

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

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

Ответ 1

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

Ответ 2

Теги говорят, что .NET 2.0; Если вы используете С# 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 с С# 3.0.

Ответ 3

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

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

public static DataTable ToDataTable(this IDataReader reader)

Попробуйте вызвать его так:

DataReaderExtensions.ToDataTable(
   cust.GetCustomerOrderSummary((string)Session["CustomerNumber"])
   )

Ответ 4

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

foo.Bar()

:

ExtensionClass.Bar(foo)