Возможно ли это закодировать следующим образом: public static T GetValue (имя строки, тип T){…}

#c#

#c#

Вопрос:

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

 public static T GetValue(this SerializationInfo si, string name,Type T)
{
    return (T) si.GetValue(name, typeof (T));
}
  

Я уже знаю, что следующий код может работать должным образом

 public static T GetValue<T>(this SerializationInfo si, string name)
{
    return (T) si.GetValue(name, typeof (T));
}
  

и мой код написан на c #,
кто-нибудь может помочь?

Комментарии:

1. зачем вам нужен этот дополнительный параметр? Это не требуется — или вы пытаетесь написать нестандартную версию?

2. Зачем вам нужно кодировать подобным образом?

3. хорошо, причина, по которой мне нужно закодировать так :

4. хорошо, причина, по которой мне нужно закодировать так: в моем классе, который реализует ISerilizable, есть много полей для хранения / повторного поиска, я сначала пишу этап сохранения, подобный этому, ..(…){info.AddValue(«myfield», myfield); …}. И я хочу получать коды извлечения автоматически. в настоящее время я использовал редактор регулярных выражений, чтобы восстановить это таким образом: $ 2 = info.GetValue<double>(«$ 1»); … ок, «<double>» не может быть заменен автоматически. итак, мне нужен код извлечения, подобный этому: $ 2 = info.GetValue(«$ 1», typeof ($ 1)); Это понятно? Есть ли альтернативный способ? любая помощь будет оценена! Спасибо за ответ!

Ответ №1:

Возвращаемый тип T в первом примере не относится ни к какому допустимому типу: T в этом случае это просто имя параметра, переданного методу.

Вы либо знаете тип во время разработки, либо нет, и если вы этого не знаете, то ваш единственный выбор — вернуть тип Object или какой-либо другой базовый тип или интерфейс.

Комментарии:

1. Методы расширения не могут быть определены в универсальных классах, поэтому нет, это не сработает.

Ответ №2:

Нет, вы не можете этого сделать, потому что обобщения оцениваются при компиляции (и вы запрашиваете динамические обобщения). Можете ли вы предоставить более подробный контекст использования?

Как вы получаете свой t параметр для передачи в желаемый пример? Если это просто by typeof(int) в качестве параметра, то почему бы не использовать общий exmaple?

Рассмотрим этот пример:

 Type t = GetTypeInfoBasedOnNameInAFile();
int a = GetValue(someSerializationInfo, "PropertyName", t);
  

Как компилятор может узнать, что Type t будет преобразовано в int во время выполнения?

Что вы могли бы сделать, так это заставить GetValue вернуть объект, а затем:

 Type t = GetTypeInfoBasedOnNameInAFile();
int a = (int)GetValue(someSerializationInfo, "PropertyName", t);
  

Но, конечно, если вы делаете это, это подразумевает, что вы знаете ожидаемые типы во время компиляции, так почему бы просто не использовать универсальный параметр.

Возможно, вы можете достичь того, что вам нужно (я не уверен в контексте / использовании), используя dynamic переменные.

Комментарии:

1. хорошо, причина, по которой мне нужно закодировать так: в моем классе, который реализует ISerilizable, есть много полей для хранения / повторного поиска, я сначала пишу этап сохранения, подобный этому, ..(…){info.AddValue(«myfield», myfield); …}. И я хочу получать коды извлечения автоматически. в настоящее время я использовал редактор регулярных выражений, чтобы восстановить это таким образом: $ 2 = info.GetValue<double>(«$ 1»); … ок, «<double>» не может быть заменен автоматически. итак, мне нужен код извлечения, подобный этому: $ 2 = info.GetValue(«$ 1», typeof ($ 1)); Это понятно? Есть ли альтернативный способ? любая помощь будет оценена! Спасибо за ответ!

2. @BeastToHuman — хорошо, но как вы на самом деле используете это значение, когда оно у вас есть? Например, делаете ли вы double b = info.GetValue("$1"); ? Если это так, вы можете просто указать double в качестве типа на этом этапе. Если вы просто делаете, var b = info.GetValue("$1"); используете ли вы b на каком-либо этапе? Если это так, вы, должно быть, предполагаете, что на данном этапе это определенный тип, так почему бы не указать этот тип при GetValue вызове?

Ответ №3:

Вы можете выполнить преобразование среды выполнения в тип:

 Convert.ChangeType(sourceObject, destinationType);
  

Я полагаю, что это синтаксис. Конечно, это вызовет исключение, если приведение невозможно.