Могу ли я сделать общий необязательный, по умолчанию для определенного класса?
Мой вопрос связан сЕсть ли разумный подход кдефолт" параметры типа в C # Generics?, но использование внутреннего универсального класса, который не подходитт работа.
Данный код выглядит так:
using System;
public class FooEventArgs : EventArgs
{
// ... T properties and a constructor
}
public class Foo
{
public delegate void EventHandler(object sender, FooEventArgs e);
public event EventHandler Changed
}
И с этим используется так:
public class User
{
public Foo foo1;
public Foo foo2;
public User()
{
foo1 = new Foo();
foo2 = new Foo();
foo1.Changed += foo1_Changed;
foo2.Changed += foo2_Changed;
}
protected void foo1_Changed(object sender, FooEventArgs e) { ... }
protected void foo2_Changed(object sender, FooEventArgs e) { ... }
}
Ну яМне бы очень понравилось, если бы я мог иметь общий необязательный, так как будет много случаев, когда я неНе знаю, к какому типу что-то придет. (Данные поступают из внешней системы, которая имеет свои собственные типы переменных, которые затем преобразуются в типы .NET, но я сталкиваюсь с ситуациями, когда, например, один удаленный тип данных может превратиться в один из нескольких типов .NET, или где это "любой" тип-таким образомobject
будет единственным реальным ответом для этого случая.)
Решение, которое сразу пришло мне в голову, было подклассом (это было также основным предложением в вопросе, связанном с ранее):
public class Foo : Foo
{
public Foo(...) : base(...) { }
}
public class FooEventArgs : FooEventArgs
{
public Foo(...) : base(...) { }
}
Затем я хочу использовать это так:
public class User
{
public Foo foo3;
public User()
{
foo3 = new Foo();
foo3.Changed += foo3_Changed;
}
protected void foo3_Changed(object sender, FooEventArgs e) { ... }
}
Проблема в том, что он, естественно, выигралработать сfoo3_Changed
принимающийFooEventArgs
; это нужноFooEventArgs
, как'с чемFoo.Changed
событие получит пропуск к нему (как значение придет изFoo
).
Foo.cs(3,1415926): error CS0123: No overload for 'foo3_Changed' matches delegate 'FooLibrary.Foo.EventHandler'
Могу ли я что-нибудь с этим сделать, кроме дублирования большей части класса?
Я попробовал еще одну вещь: неявный оператор для преобразования изFooEventArgs
кFooEventArgs
public static implicit operator FooEventArgs(FooEventArgs e)
{
return new FooEventArgs(...);
}
Это, к сожалению, некажется, работает, хотя ям, не совсем понятно, почему:
EditBuffer.cs(13,37): error CS0553: 'FooLibrary.FooEventArgs.implicit operator FooLibrary.FooEventArgs(FooLibrary.FooEventArgs)': user-defined conversions to or from a base class are not allowed
Итак, еще раз, могу ли я что-то сделать с этим, или я правильно думаю, что этос тобой удачапросто придется довольствоваться использованиемFooEventArgs
(и тогда я думаю, что я могу просто использоватьFoo
)?