Return T 其中有不同的 return 类型
Return T where are different return types
我有不同的 return 类型,所以我无法决定使用什么。
我在考虑类似下面的内容,但如果您有其他想法,我愿意接受。
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
}
我想决定我想要什么类型 return 所以它匹配,否则它会抛出一个编译时错误。
我昨天看到了这个,我很好奇我怎样才能重现它。
// 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")
我不明白将 switch case 放在 for 循环中的意义。你将在你的 switch 的一个 case 第一次为真时退出循环。
但是为了处理 return 类型的不确定性问题,如果你知道 return 类型是引用类型,那么你也可以这样做:
您可以将 return 类型设置为 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 ...
}
}
我有不同的 return 类型,所以我无法决定使用什么。 我在考虑类似下面的内容,但如果您有其他想法,我愿意接受。
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
}
我想决定我想要什么类型 return 所以它匹配,否则它会抛出一个编译时错误。
我昨天看到了这个,我很好奇我怎样才能重现它。
// 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")
我不明白将 switch case 放在 for 循环中的意义。你将在你的 switch 的一个 case 第一次为真时退出循环。
但是为了处理 return 类型的不确定性问题,如果你知道 return 类型是引用类型,那么你也可以这样做:
您可以将 return 类型设置为 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 ...
}
}