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