簡體   English   中英

實現將通用接口作為參數的通用接口

[英]Implementing generic interface that takes a generic interface as a parameter

我有這兩個接口

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

我有一個類想要實現這樣的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);
    } 

}

如何正確地做到這一點而不會失去兩個接口的通用性? 我有很多變形金剛。

該接口要求實現的方法在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);
    }
}

將您的界面更改為泛型界面而不是其中的方法

如下

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

    }

更新的代碼假設您不希望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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM