实现以泛型接口为参数的泛型接口

本文关键字:泛型接口 参数 实现 | 更新日期: 2023-09-27 18:13:38

我有这两个接口

    /// <summary>
///     Represents an interface that knows how one type can be transformed into another type.
/// </summary>
/// <typeparam name="TInput"></typeparam>
/// <typeparam name="TOutput"></typeparam>
public interface ITransformer<in TInput,out TOutput>
{
    TOutput Transform(TInput input);
}
public interface ITransform
{
    TOutput Transform<TInput,TOutput>(ITransformer<TInput, TOutput> transformer);
}

我有一个类,我想实现像这样的ittransform。

public class MessageLogs :ITransform
{
    // But I am am not able to implement the ITransform interface like this
   // MessageLogs is getting binded in the param but not getting binded to
  // TInput in the Transform<TIn,TOut>  
   // 
    public T Transform<MessageLogs, T>(ITransformer<MessageLogs, T> transformer)
    {
        return transformer.Transform(this);
    } 
}

如何在不失去两个接口的通用性的情况下正确地做到这一点?我有很多变形金刚

实现以泛型接口为参数的泛型接口

接口要求实现的方法在TInput和TOutput中都是泛型的。换句话说,messagelog也必须能够接受其他类型的输入。那不是你想要的。您将需要这样的内容:

public interface ITransformer<in TInput,out TOutput>
{
    TOutput Transform(TInput input);
}
public interface ITransform<TInput>
{
    TOutput Transform<TOutput>(ITransformer<TInput, TOutput> transformer);
}
public class MessageLogs : ITransform<MessageLogs>
{
    public TOutput Transform<TOutput>(ITransformer<MessageLogs, TOutput> transformer)
    {
        return transformer.Transform(this);
    }
}

将你的接口改为泛型接口而不是其中的方法

象下面这样

public interface ITransformer<in TInput, out TOutput>
    {
        TOutput Transform(TInput input);
    }
    public interface ITransform<TInput, TOutput>
    {
        TOutput Transform(ITransformer<TInput, TOutput> transformer);
    }
    public class MessageLogs<T> : ITransform<MessageLogs<T>,T>
    {
        public T Transform(ITransformer<MessageLogs<T>, T> transformer)
        {
            return transformer.Transform(this);
        }
    }
<<p> 更新代码/strong>假设您不希望MessageLog知道它正在被转换成什么。
public class Transformer<T1,T2> : ITransform<T1,T2>
    {
        public T2 Transform(T1 logger,ITransformer<T1, T2> transformer)
        {
            return transformer.Transform(logger);
        }
    }
    public class MessageLogs
    {
       // code specific to message logging
    }