C# Компания Comentiating Class с двумя общими параметрами Вопрос - тип t нельзя использоватьC#

Место общения программистов C#
Ответить
Anonymous
 C# Компания Comentiating Class с двумя общими параметрами Вопрос - тип t нельзя использовать

Сообщение Anonymous »

Я только что прототипирую асинхронную обработчик команды (шаблона) для приложения ASP.Net 4.8.
Паттерн принимает команду type y , использует его, чтобы вывести приемник (метод фабрики), чтобы выполнить команду, тогда возвращает как тип t .
По большей части это работает, за исключением того, что я не могу понять, как создать экземпляр приемника из -за t , имеющего ограничение , где t: new ()
Линия, вызывающая проблему, является:


_receiver = (IStateReceiver)new StateReceiver();
< /code>
< /blockquote>
с ошибкой: < /p>

Тип 't' не может использоваться в качестве параметра типа 't' в генерическом типе
или метод 'Stateceiver '. There is no boxing conversion
or type parameter conversion from 'T' to
'State.IStateReceiver'.
'T' must be a non-abstract type with a public parameterless
constructor in order to use it as parameter 'T' in the generic type or
method 'StateReceiver'
< /blockquote>
Пример приведен ниже с примером использования: < /p>
public interface IStateCommand
{
Task ExecuteAsync();
}

public interface IStateReceiver
{
Task RunCommand(Y command);
}

public sealed class StateCommand : IStateCommand
{
private IStateReceiver _receiver;
private Y _command;
private StateCommand() { /* no body */ }

public static Task CreateAsync(Y command)
{
var ret = new StateCommand();
return ret.Initialize(command);
}

public async Task Initialize(Y command)
{
_command = command;
_receiver = (IStateReceiver)new StateReceiver();

await Task.Delay(1000);
return this;
}

public async Task ExecuteAsync()
{
return await this._receiver.RunCommand(this._command);
}
}

// Example receiver.
public class StateReceiver where T: IStateReceiver, new()
{
public async Task RunCommand(Y command)
{
// Perform action here.
await Task.Delay(1000);

// Can be simple type e.g. int or complex eg BobsResultObject. Just returning default here for now.
return new T();
}
}

// Example invoke
public class StateInvoker
{
public async void PerformCommand()
{
String command = "BobsCommand";
PatientStateCommand bobsCommandObject = await StateCommand.CreateAsync(command);
var bobsResult = bobsCommandObject.ExecuteAsync();
}
}

Обновление:
Если я изменю линию приемника, чтобы иметь фактические типы t и y, и удалить интерфейс из класса приемника, я могу получить ее для компиляции.
Я не возражаю против фактических типов для T и y в заводской, однако, я не нахожусь на нем. /> Вот две части кода (с заводской реализацией) < /p>
private async Task Initialize(Y command)
{
_command = command;

if (typeof(Y) == typeof(string))
{
String localCommand = command as String;
if (localCommand != null)
{
switch (localCommand.ToLower())
{
case "bobscommand":
_receiver = new StateReceiver() as IStateReceiver;
break;
}
}
}

return this;
}
< /code>
И вот приемник без интерфейса (и некоторое основное назначение) < /p>
public class PatientStateReceiver where T : new()
{
public async Task RunCommand(Y command)
{
// Perform action here.
await Task.Delay(1000);

T t = new T();
if (typeof(T) == typeof(int))
t = (T)(object)42;
else
t = (T)(object)null;

return t;
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... e-t-cannot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»