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")

码主:https://github.com/malware-dev/MDK-SE

我不明白将 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 ...
    }
}