У меня есть разные типы возврата, поэтому я не могу решить, что использовать для этого. Я думал о чем-то подобном ниже, но если у вас есть другие идеи, я открыт для этого.
public T GetValue<T>(ContentType type)
{
foreach (SyndicationItem item in feed.Items)
{
switch (type)
{
case ContentType.BaseUri:
return item.BaseUri;
break;
case ContentType.Categories:
return item.Categories;
break;
case ContentType.Content:
return item.Content;
break;
case ContentType.Contributors:
return item.Contributors;
break;
case ContentType.Copyright:
return item.Copyright;
break;
}
}
}
public enum ContentType
{
BaseUri,
Categories,
Content,
Contributors,
Copyright
}
Я хотел бы решить, какой тип я хочу вернуть, чтобы он соответствовал, иначе это приведет к ошибке времени компиляции.
Непонятно, где вы ожидаете возникновения ошибки времени компиляции. Что, если бы я вызвал это из другого универсального метода, принимающего ContentType
, который не будет знать во время компиляции, что такое тип содержимого. Даже если вы вызываете его из неуниверсального метода, у вас может быть переменный тип содержимого... и, возможно, если вы этого не сделаете, вы все равно должны обращаться к свойству напрямую. Если бы вы могли предоставить больше информации о том, как вы ожидаете, что это будет взаимодействовать с вызывающим кодом, вам было бы легче помочь.
ваша проблема неясна. попробуйте вернуть объект, посмотрите ключевые слова "как" и "есть"
Не рассматривайте совершенно разные типы вместе в одном элементе притворяясь, у них есть что-то общее. Если это не так, вы не должны использовать дженерики, но иметь пять разных методов. Если они это сделают, извлеките общий базовый тип и сделайте так, чтобы метод имел общий сын.
Я видел решение для этого. Может быть, я просто неправильно это понял, но я написал это в ответе.
@mehrandvd ОП спрашивает о вещах, в которых ты мастер.
Поскольку T
должен быть указан на вызывающем конце этого вызова, должно быть ясно, что метод не может изменять это T
как часть вызова. Вам придется остановиться на T
, от которого наследуются все объекты, что в конечном итоге может быть object
. Возможно, имеет смысл сделать так, чтобы T
контролировал, какой предмет вы хотите. Тем не менее, код будет очень странным, полным слепков. Вы уверены, что это правильный подход? Почему вызывающий код не может сделать это: var copyright = feed.Items.First().Copyright;
?
Я видел это вчера, и мне было любопытно, как я могу воспроизвести это.
// Summary:
// Returns value of specified property as Sandbox.ModAPI.Interfaces.ITerminalProperty.TypeName
//
// Parameters:
// block:
// block reference
//
// propertyId:
// property id (name)
//
// Type parameters:
// T:
// required value type of Sandbox.ModAPI.Interfaces.ITerminalProperty.TypeName
//
// Returns:
// property value as Sandbox.ModAPI.Interfaces.ITerminalProperty.TypeName
public static T GetValue<T>(this Ingame.IMyTerminalBlock block, string propertyId);
Вот как вы это называете. item.GetValue<StringBuilder>("gpsCoords")
И вы можете запросить другое свойство с другим типом. item.GetValue<bool>("IsPerm")
Владелец кода: https://github.com/malware-dev/MDK-SE
Это не ответ на ваш опубликованный вопрос. Ваш вопрос должен быть обновлен, чтобы включить эту информацию. Если это не связано с вашим вопросом выше, его следует опубликовать как новый вопрос. В любом случае, этот ответ следует удалить.
Я не понимаю смысла помещать случай переключения в цикл for. вы выйдете из цикла в первый раз, когда один из случаев вашего переключателя будет истинным.
Но чтобы справиться с проблемой неопределенности в отношении возвращаемого типа, если вы знаете, что возвращаемый тип будет ссылочным типом, вы также можете сделать это:
Вы можете установить тип возвращаемого значения object
, и тогда вызывающая сторона должна выполнить кастинг:
public object GetValue(ContentType type)
{
switch (type)
{
case ContentType.BaseUri:
return item.BaseUri;
break;
case ContentType.Categories:
return item.Categories;
break;
case ContentType.Content:
return item.Content;
break;
case ContentType.Contributors:
return item.Contributors;
break;
case ContentType.Copyright:
return item.Copyright;
break;
}
}
абонент:
public void Caller()
{
object x = GetValue();
if ( x.GetType() == typeof(BaseUri) ) // I assume that BaseUri is also a class name
{
BaseUri baseUri = (BaseUri)x;
// now you can use baseUri to initialize another variable in outer scopes ... or use it as a parameter to some method or ...
}
else if (x.GetType() == typeof(Category))
{
// the same logic of casting and using goes here too ...
}
}
если вы обнаружите, что переключаетесь таким образом или используете typeof в универсальном методе, это как правило признак того, что что-то не так, и вам нужно подумать об этом еще раз. чтобы ответить на ваш вопрос, вы не можете делать такие вещи во время выполнения. это подпадает под знамя магического вывода.. однако вы можете вернуть объект