1

核心問題

typeof私の問題の核心は、バインドされていないジェネリックを型パラメーターとして、オペレーターに渡される別のジェネリック型に提供するための正しい構文を学習することです。

typeof(IEnumerable<IEnumerable<>>))

これの適切な構文は何ですか?

Ninject ユースケース

Ninjectで以下を実現したいと思います。

次のインターフェースと実装があるとします。

public interface IParser<in TIn, out TOut>
{
    TOut Parse(TIn input);
}

public class IntParser : IParser<string, int>
{
    public int Parse(string input)
    {
        return int.Parse(input);
    }
}

public class SpaceSeperatedParser<T> : IParser<string, IEnumerable<T>>
{
    private readonly IParser<string, T> _itemParser;

    public SpaceSeperatedParser(IParser<string, T> itemParser)
    {
        _itemParser = itemParser;
    }

    public IEnumerable<T> Parse(string input)
    {
        return input.Split(' ').Select(_itemParser.Parse);
    }
}

これらの型を Ninject カーネルにバインドしたいと考えています。SpaceSeperatedParserただし、可能なすべての型を列挙する必要がないように、一般的な方法でバインドするのに苦労していTます。

構文的には、これは私が探していることを行うべきだと思われます。残念ながら、構文的にも正しくありません!

IKernel kernel = new StandardKernel();
kernel.Bind(typeof (IParser<string, int>)).To(typeof (IntParser));

// does not work -- syntax error
kernel
    .Bind(typeof(IParser<string, IEnumerable<>>))
    .To(typeof(SpaceSeperatedParser<>));

// works, but is not generic
// kernel
//    .Bind(typeof (IParser<string, IEnumerable<int>>))
//    .To(typeof (SpaceSeperatedParser<int>));

// should return a SpaceSeperatedParser<int>, with IntParser as _itemParser
var parser = kernel.Get<IParser<string, IEnumerable<int>>>();

Console.WriteLine(string.Join(", ", parser
    .Parse("23 42 9 32 10")
    .Select(i => i + 5)));

Ninject はこれをサポートしていますか?

4

0 に答える 0