Я только что прототипирую асинхронную обработчик команды (шаблона) для приложения ASP.NET, работающего на .net 4.8.
Паттерн принимает команду типа y , использует его, чтобы вывести приемник (метод заводя t .
По большей части это работает, за исключением того, что я не могу понять, как создать экземпляр приемника из -за t , имеющего ограничение, где t: new ()
Строка, вызывающая проблему, является:
._receiver = (IStateReceiver)new StateReceiver();
< /code>
С ошибкой: < /p>
Тип 't' не может использоваться в качестве параметра типа 't' в общем типе или методе 'staterceiver '. Не существует преобразования в боксе или преобразования параметров типа от 't' в atember.istaterceiver '. < /P>
' t 'должен быть неабстроктным типом с общедоступным конструктором без параметра ' < /p>
'< /p>
' < /p>
'< /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";
StateCommand bobsCommandObject = await StateCommand.CreateAsync(command);
var bobsResult = bobsCommandObject.ExecuteAsync();
}
}
, если я изменяю строку приемника, чтобы иметь фактические типы 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 StateReceiver 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
C# Компания Comentiating Class с двумя общими параметрами Вопрос - тип t нельзя использовать ⇐ C#
Место общения программистов C#
1755039294
Anonymous
Я только что прототипирую асинхронную обработчик команды (шаблона) для приложения ASP.NET, работающего на .net 4.8.
Паттерн принимает команду типа y , использует его, чтобы вывести приемник (метод заводя t .
По большей части это работает, за исключением того, что я не могу понять, как создать экземпляр приемника из -за t , имеющего ограничение, где t: new ()
Строка, вызывающая проблему, является:
._receiver = (IStateReceiver)new StateReceiver();
< /code>
С ошибкой: < /p>
Тип 't' не может использоваться в качестве параметра типа 't' в общем типе или методе 'staterceiver '. Не существует преобразования в боксе или преобразования параметров типа от 't' в atember.istaterceiver '. < /P>
' t 'должен быть неабстроктным типом с общедоступным конструктором без параметра ' < /p>
'< /p>
' < /p>
'< /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";
StateCommand bobsCommandObject = await StateCommand.CreateAsync(command);
var bobsResult = bobsCommandObject.ExecuteAsync();
}
}
, если я изменяю строку приемника, чтобы иметь фактические типы 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 StateReceiver 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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79731569/c-sharp-instantiating-class-with-two-generic-parameters-question-type-t-cannot[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия