我有一个包含方法的基类.我希望能够使用基类中定义的静态方法从派生类的实例(可能覆盖该方法)中调用该方法.目前我的代码如下所示:
基类
public abstract class BaseClass<T> where T : class, new()
{
protected BaseClass()
{
}
protected BaseClass(string constructorParam)
{
Property = constructorParam;
}
protected readonly string Property;
public virtual void Action(string methodParam)
{
//Do some stuff
}
public static void DoAction<U>(string constructorParam, string methodParam) where U : BaseClass<T>, new()
{
BaseClass<T> myObject = (BaseClass<T>) Activator.CreateInstance(typeof(U), new object[] {constructorParam});
myObject.Action(methodParam);
}
Run Code Online (Sandbox Code Playgroud)
}
派生类
public DerivedClass : Migrater<SomeClass>
{
public DerivedClass()
{
}
public DerivedClass(string constructorParam) : base(constructorParam)
{
}
public override void Action(string emthodParam)
{
//Do some other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但是当我调用我的DoAction方法时,它看起来像这样:
DerivedClass.DoAction<DerivedClass>(someValue, someValue);
Run Code Online (Sandbox Code Playgroud)
在我看来,这看起来很丑陋和冗余,并表明可能有更好的方法.理想情况下,我想要更像这样的东西:
BaseClass.DoAction<DerivedClass>(someValue, someValue);
Run Code Online (Sandbox Code Playgroud)
甚至这个:
DerivedClass.DoAction(someValue, someValue);
Run Code Online (Sandbox Code Playgroud)
无需在派生类中定义任何内容.这可能吗?
您也可以U在类级别定义.
public abstract class BaseClass<T, U>
where T : class, new()
where U : BaseClass<T, U>, new()
{
public static void DoAction(string constructorParam, string methodParam)
{
BaseClass<T, U> myObject = (BaseClass<T, U>) Activator.CreateInstance(typeof(U), new object[] {constructorParam});
myObject.Action(methodParam);
}
}
Run Code Online (Sandbox Code Playgroud)
那么你对派生类的定义是这样的:
public DerivedClass : Migrater<SomeClass, DerivedClass>
{
}
Run Code Online (Sandbox Code Playgroud)
这样就可以这样调用它:
DerivedClass.DoAction(someValue, someValue);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |