Как я могу определить метод интерфейса, чья другая реализация может вернуть <T>, List <T>, List где T пользовательский класс - PullRequest
0 голосов
/ 16 апреля 2020
interface IParser
{
     return type parseData(list<byte> data);
}

Где типом возврата может быть T, List<T> или List<List<T>>

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Объявите ваш интерфейс следующим образом:

interface IParser<T>
{
    T ParseData(List<byte> data);
}

Можно использовать следующим образом:

public class Parser<T> : IParser<T>
{
    public virtual T ParseData(List<byte> data) //virtual is optional
    {
        //do stuff and return T
        //T could be anything, a List, a struct, a class what ever
        return default(T);
    }
}

Если вам нужен специальный c синтаксический анализатор, вы можете сделать это:

public class StringParser : Parser<string>
{
    public override string ParseData(List<byte> data)
    {
        return string.Empty;
    }
}

Или, если вам нужен специфический c синтаксический анализатор для коллекции T

public class CollectionParser<TItem> : Parser<IEnumerable<TItem>>
{
    public override IEnumerable<TItem> ParseData(List<byte> data)
    {
        return Enumerable.Empty<TItem>;
    }
}
0 голосов
/ 16 апреля 2020

Примерно так:

public interface IParser<TOut> where TOut : class
{
    TOut ParseData(List<byte> data);
}

edit

Поскольку вопрос касался T как пользовательского класса, убедитесь, что тип TOut является классом. Возможно, хорошим дополнением будет следующее:

public interface IParser<in TIn, out TOut> where TOut : class
{
    TOut ParseData(TIn data);
}

, а реализация будет выглядеть так:

class Parser : IParser<List<byte>, CustomClass>
{
    CustomClass ParseData(List<byte> data)
    {
     return new CustomClass();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...