Общий тип как параметр, который должен реализовывать определенный интерфейс - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть метод, который я хочу воссоздать более общий.

public Task<bool> DoSomething<T>(T t) where T : Type, IAnyInterface

Как видите, я хочу Тип в качестве параметра, который должен реализовывать IAnyInterface

Но если я вызову метод,

DoSomething(typeof(ObjectThatImplementsIAnyInterface));

Я получаю ошибку:

Тип «System.Type» нельзя использовать в качестве параметра типа «T» в универсальном типе или методе «DoSomething (...)». Неявное преобразование из «System.Type» в «IAnyInterface»

Так как я могу добиться, чтобы метод принимал этот тип?

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Вы называете это неправильно. Вам нужно передать объект, который реализует интерфейс, а не его тип:

DoSomething(new ObjectThatImplementsIAnyInterface());
0 голосов
/ 17 сентября 2018

не хочу передавать экземпляр, иначе я хочу создать экземпляр внутри метода DoSomething (...)

затем просто пропустите параметр. В вашем случае это кажется бесполезным. Пусть спецификация будет выполнена в общем вызове:

public Task<bool> DoSomething<T>() where T : IAnyInterface
{
    Type type = typeof(T);
    // Or create the entire instance:
    T newInstance = Activator.CreateInstance<T>();
}

Звоните:

DoSomething<ObjectThatImplementsIAnyInterface>();

Редактировать: еще один способ создания экземпляра - запросить конструктор без параметров:

public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
    T newInstance = new T();
}

документация CreateInstance

0 голосов
/ 17 сентября 2018

Вы просто хотите

public Task<bool> DoSomething<T>(T t) where T : IAnyInterface

, который определяет, что T является типом, который должен реализовывать IAnyInterface.

Вышеуказанное позволит вам передать экземпляр в качестве параметра ивывод T:

DoSomething(new ObjectThatImplementsIAnyInterface());

Дополнительная информация об ограничениях типов: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters


На основе вашего комментария:

Не знаюхотите передать экземпляр, иначе я хочу создать экземпляр внутри метода

Похоже, вы можете захотеть ограничение new(), которое позволяет создавать экземпляр внутри метода (Примечание: выпонадобится ctor без параметров):

public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
    // now you can do this:
    IAnyInterface inst = new T();
}

Учитывая DoSomething<ObjectThatImplementsIAnyInterface>() вызов.

Вы, конечно, можете использовать подход, при котором вы можете передать его или создать его

public Task<bool> DoSomething<T>(T t = null) where T : class, IAnyInterface, new()
{
    // now you can do this:
    IAnyInterface inst = t ?? new T();
}

Если вы хотите узнать фактический тип во время выполнения, это просто

var runtimeType = typeof(T);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...