Методы Расширения C#, только видимые и доступные в одном (“частном”) классе

Если Вы не заботитесь о возврате ничего пользователю, можно просто разжечь или отдельный поток, или для быстрого и грязного подхода, использовать делегата и вызвать его asynchrnously. Если Вы не заботитесь об уведомлении пользователя, когда асинхронная задача заканчивается, можно проигнорировать обратный вызов. Попытайтесь поместить точку останова в конце SomeVeryLongAction () метод, и Вы будете видеть, что это заканчивает бежать за страницей, был уже подан:

private delegate void DoStuff(); //delegate for the action

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
    //create the delegate
    DoStuff myAction = new DoStuff(SomeVeryLongAction); 
    //invoke it asynchrnously, control passes to next statement
    myAction.BeginInvoke(null, null);
    Button1.Text = DateTime.Now.ToString();
}


private void SomeVeryLongAction()
{
    for (int i = 0; i < 100; i++)
    {
        //simulation of some VERY long job
        System.Threading.Thread.Sleep(100);
    }
}
11
задан abatishchev 20 July 2010 в 19:17
поделиться

2 ответа

Методы расширения могут быть определены только в статическом неуниверсальном внешнем (невложенном) классе.

Что я обычно делаю в таких сценариях, так это создаю отдельный статический внутренний класс в другом пространстве имен в том же файле, а затем включаю это пространство имен только в этот файл.

Он все равно будет виден другим классам в этой сборке; единственный способ избежать этого - переместить потребляющий класс ( класс A в вашем примере) в его собственную сборку, чего вы, вероятно, не захотите делать.

15
ответ дан 3 December 2019 в 03:36
поделиться

Объявите свои методы расширения в отдельном пространстве имен, и вы можете включить это пространство имен в определенные файлы, которые вы хотите их использовать. Затем объявите ClassA (класс, в котором вы хотите использовать свои методы расширения) в отдельном файле и используйте это пространство имен в верхней части ClassA.cs. Таким образом, только этот класс будет иметь доступ к этим методам расширения.

Изменить:

Что-то вроде следующего

namespace Extension {
    public static class ExtensionMethods {
        public static string EnumValue(this MyEnum e) {
            switch (e) {
                case MyEnum.First:
                    return "First Friendly Value";
                case MyEnum.Second:
                    return "Second Friendly Value";
                case MyEnum.Third:
                    return "Third Friendly Value";
            }
            return "Horrible Failure!!";
        }
    }
}

ClassA.cs:

using Extension;

public class ClassA{
    //Work your magic here, using the EnumValue Extension method
    //wherever you want
}

ClassB.cs

public class ClassB{
    //EnumValue is not a valid Extension Method here.
}
12
ответ дан 3 December 2019 в 03:36
поделиться