嗨,我想知道是否可以通过以下方式在Interface及其具体实现中强制转换type。
public class BaseTypeClass
public class BaseTypeV1 : BaseTypeClass
public class BaseTypeV2 : BaseTypeClass
public class BaseTypeV3 : BaseTypeClass
public interface IProcessBaseType<T> where T : BaseTypeClass
void Process(T baseType)
public class ProcessBassTypeClass : IProcessBassType
void Process(BaseTypeV1 data)
void Process(BaseTypeV2 data)
void Process(BaseTypeV3 data)
这样做很简单:
public class ProcessBassTypeClass : IProcessBaseType<BaseTypeV1>, IProcessBaseType<BaseTypeV2>, IProcessBaseType<BaseTypeV3>
{
public void Process(BaseTypeV1 baseType)
{
throw new NotImplementedException();
}
public void Process(BaseTypeV2 baseType)
{
throw new NotImplementedException();
}
public void Process(BaseTypeV3 baseType)
{
throw new NotImplementedException();
}
}
您可能要考虑的替代方法是:
public interface IProcessBaseType
{
void Process<T>(T baseType) where T : BaseTypeClass;
}
public class ProcessBassTypeClass : IProcessBaseType
{
public void Process<T>(T baseType) where T : BaseTypeClass
{
throw new NotImplementedException();
}
}
这允许BaseTypeClass
传递任何类型的对象,并允许在运行时Process
调用typeof(T)
以获取实际类型。如果要动态构建可用的处理器列表,则很有用。
这是一个简单的示例,说明了使用第二个代码示例时如何在运行时添加特定于类型的处理器:
public class ProcessBassTypeClass : IProcessBaseType
{
private Dictionary<Type, Delegate> _processors = new Dictionary<Type, Delegate>();
public void AttachProcessor<T>(Action<T> processor) where T : BaseTypeClass
{
_processors[typeof(T)] = processor;
}
public void Process<T>(T baseType) where T : BaseTypeClass
{
if (_processors.ContainsKey(typeof(T)))
{
((Action<T>)(_processors[typeof(T)])).Invoke(baseType);
}
else
{
throw new NotSupportedException();
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句