Return T, где разные типы возврата - PullRequest
2 голосов
/ 09 апреля 2019

У меня разные типы возвращаемых данных, поэтому я не могу решить, что для этого использовать. Я думал об этом ниже, но если у вас есть другие идеи, я открыт для этого.

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 ]

0 голосов
/ 09 апреля 2019

У меня нет смысла помещать корпус переключателя в цикл 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 ...
    }
}
0 голосов
/ 09 апреля 2019

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

        // 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

...