实现将通用接口作为参数的通用接口

Sam*_*eer 5 .net c# generics

我有这两个接口

    /// <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);
}
Run Code Online (Sandbox Code Playgroud)

我有一个类想要实现这样的ITranform.

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);
    } 

}
Run Code Online (Sandbox Code Playgroud)

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

Den*_*s_E 3

该接口要求实现的方法在 TInput 和 TOutput 中都是通用的。换句话说,MessageLogs 也必须能够接受 TInput 的其他类型。那不是你想要的。你将需要类似的东西:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)