Return T, где разные типы возврата
У меня есть разные типы возврата, поэтому я не могу решить, что для этого использовать. Я думал об этом ниже, но если у вас есть другие идеи, я открыт для этого.
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
}
Я хотел бы решить, какой тип я хочу вернуть, чтобы он соответствовал, иначе это приведет к ошибке времени компиляции.
2 ответа
У меня нет смысла помещать корпус переключателя в цикл 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 ...
}
}
Я видел это вчера, и мне было любопытно, как я могу воспроизвести это.
// 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