使用此关键字时的 C# 泛型类型

标签 c# generics this

我放在一起的对象是为了允许一个对象将自己暴露为可以被另一个相同类型的对象转换的东西。按照合并的思路思考,但操作不是通用/直接的,因此您可以使用反射来简单地获取所有属性并执行一些预定的操作集。因此,我决定尝试将其实现为将自身暴露为可转换的对象,并将其附加到一个知道如何执行转换(可以互换)的对象。到目前为止我的可编译代码是:

public interface ITransformer<TType> where TType : class
{
    void Transform(TType source, TType destination);
}

public interface ITransformable<TType> where TType : class
{
    bool Locked { get; set; }
    ITransformer<TType> Transformer { get; set; }

    void TransformFrom(TType source);
}

public class MyTransformer : ITransformer<MyTransformable>
{
    public void Transform(MyTransformable source, MyTransformable destination)
    {
        // Perform some logic for the transform
    }
}

public class MyTransformable : ITransformable<MyTransformable>
{
    public bool Locked { get; set; }
    public ITransformer<MyTransformable> Transformer { get; set; }

    public string Value1 { get; set; }
    public uint Value2 { get; set; }
    public bool Value3 { get; set; }

    public void TransformFrom(MyTransformable source)
    {
        Transformer.Transform(source, this);
    }
}

如您所见,类型MyTransformable包含一些数据(Value1 - Value3)以及Locked状态和Transformer对象将知道如何执行此项目的转换(泛型确保仅允许能够作用于 MyTransformer 类型的转换器)。

我的问题是我不希望所有 Transformable 类型的新对象都必须重复调用

public void TransformFrom(MyTransformable source)
{
    Transformer.Transform(source, this);
}

所以希望我可以将 MyTransformable 对象添加到

public abstract class Transformable<TType> : ITransformable<TType> where TType : class
{
    public bool Locked { get; set; }
    public ITransformer<TType> Transformer { get; set; }

    public void TransformFrom(TType source)
    {
        Transformer.Transform(source, this);  // ERROR! this is type Transformable<TType> not TType
    }
}

public class MyTransformable : Transformable<MyTransformable>
{

}

但是,由于我突出显示的错误,这当然不会编译。我觉得我已经错过了沿线某个地方的要点。有人能指出我正确的方向吗?

最佳答案

您需要做的是为派生类型添加一个 Hook ,以公开最终的、真正的 TType 实现(或简单地 this)。这最好通过抽象属性来完成。

public abstract class Transformable<TType> : ITransformable<TType>
{
    public bool Locked { get; set; }
    public ITransformer<TType> Transformer { get; set; }

    protected abstract TType Value { get; }

    public void TransformFrom(TType source)
    {
        Transformer.Transform(source, Value); 
    }
}

public class MyOtherTransformable : Transformable<MyTransformable>
{
    protected override MyTransformable Value
    {
        get { return this; }
    }
}

关于使用此关键字时的 C# 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9673926/

相关文章:

c# - .NET 4.0 和 Windows 7 上的性能计数器

php - 重新分配 $this 时的有趣行为

javascript - 匿名函数的上下文是什么?

javascript - 使用 () 强制 JavaScript 解释器首先进行计算

c# - 使用 C# 读取和查询 txt/日志文件

C# 项目从设计器中的引用项目识别用户控件,但在编译时不识别

c# - 在 C# 中使用 DI 登录到控制台

基类中的 C# 泛型类型

c# - 为什么 "dynamic"在用作泛型类型参数时对于所有类型都不是协变和逆变的?

java - 为什么在引入泛型时没有实现钻石运算符?