使用基类进行C#接口类型转换

埃文公园

嗨,我想知道是否可以通过以下方式在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用C#和反射将接口类型转换为具体类型

使用Typescript进行接口类型检查

转换为接口类型和使用类型进行简单声明之间的区别

具有某些接口类型的通用C#类未使用第一个接口的成员实现其他接口

转换接口类型的列表,使用Java 8另一类名单

C#:定义类和接口类型的参数的任何方法吗?

为什么我需要在C#显式实现中将'this'转换为接口类型?

C#属性,通过接口访问时返回接口类型,而通过具体类访问时返回具体类型

当类从接口继承且类型从接口类型方法继承时,C#错误CS0738

使用泛型将接口类型映射到类

将使用URLClassLoader创建的对象转换为接口类型

C#中的通用接口类型推断怪异

关闭无法隐式转换为通用接口类型的成员的通用接口的类的实例

接口类型实例来自哪个类

组合的类和接口类型

Typescript类不会影响接口类型

Delphi:如何从接口类型变量访问对象的基类方法

protobuf-net从基类中跳过(接口类型的)成员

在使用Jackson进行类序列化时添加类型信息,以便可以在不使用注释的情况下使用接口类型反序列化?

如何使用实现父接口的类中的构造函数初始化接口类型的对象?

为什么必须将类明确转换为其接口类型?

如何角色使用c#IList接口类型或其他接口作为类型?

在包含所述接口类型的成员的类上定义接口类型的正确方法

在C#中使用通用类型实现接口的类的工厂?

泛型类型的隐式转换失败,接口类型

Typescript接口类型值转换为联合类型

Typescript将未知类型转换为接口类型

将具体的实现类型转换为通用接口类型

将具有基类的抽象类转换为接口C#