使用您自己的问题,您不能只使用界面吗?
public interface IMyControl<T> where T:class
{
T Field { get; set;}
event EventHandler<MyEventArgs<T>> MyEvent;
}
public class MyControl<T> : UserControl, IMyControl<T> where T:class
{
public T Field { get; set;}
public event EventHandler<MyEventArgs<T>> MyEvent;
}
然后使用:
// (which equates to IMyControl control = ...)
var control = condition ? new MyControl<ClassA>() : new MyControl<ClassB>();
control.Field = null;
control.Enabled = false;
这为您要使用的每个类型参数节省了多个类,因此鼓励代码重用并遵循多态性 (OOP)。
希望这有帮助!
编辑
好的——所以亚历克斯是对的,我不应该从臀部开火!经过一番调查,这似乎比我想象的要困难得多!所以我开始怀疑你问的是不是正确的方法。现在,是否是你想要的答案,我不知道,但这里是你思考的问题。
基本上,不要使用泛型。在这种情况下,生活真的很艰难!相反,隐藏在接口后面。下面的代码实现了与您在上面尝试的相同,但您现在将字段绑定到“具体”接口。但实际上,你想要这个——你应该知道行为和模式,否则,在我看来,你不知道你的系统应该做什么,因此你的要求有问题。无论如何,召唤结束,这里有一些代码!
public interface IMyClass
{
int I { get; set; }
string S { get; set; }
}
public interface IMyControl
{
IMyClass Field { get; set; }
event EventHandler<EventArgs> MyEvent;
}
public class MyControl : UserControl, IMyControl
{
public MyControl(IMyClass field)
{
this.Field = field;
}
public IMyClass Field { get; set; }
public event EventHandler<EventArgs> MyEvent;
}
public class MyClass1 : IMyClass
{
public int I { get; set; }
public string S { get; set; }
public override string ToString()
{
return "I am a MyClass1!!!";
}
}
public class MyClass2 : IMyClass
{
public int I { get; set; }
public string S { get; set; }
public override string ToString()
{
return "I am a MyClass2!!!";
}
}
var control = someCondition ? new MyControl(new MyClass1()) : new MyControl(new MyClass2());