Andy Lanng Ответов: 1

Приведение списка к универсальному типу?


Привет,

У меня есть метод" T GetConfig<t>". Это может вернуть базовый тип или список< int>

Сейчас у меня есть дело, где T-это список<инт&ГТ; мой результат-список<инт&ГТ;, но я "не список актеров и Л;int> К тип Т".

Есть ли простой способ обойти это?
Или мне нужно создать метод" List<t> GetConfigList<t>"?

Та
Энди

Что я уже пробовал:

Ну это не сработало:
(T)SelectMenu.SelectByIdAndSelected(menuId.Value, (int)config.Value)

Mehdi Gholam

Как правило, вы должны вернуть одну вещь, если не возвращаете объект, и пусть вызывающий это выяснит.

Tomas Takac

Боюсь, вам придется добавить больше контекста. Например, как ваш пример связан с методом GetConfig?

Richard MacCutchan

Вы не можете этого сделать, потому что компилятор должен знать, что возвращается. Если вам это действительно нужно, то вы можете изменить его, чтобы вернуть какой-то составной объект, и пусть вызывающий его вычислит. Кроме того, создайте другой метод, который всегда возвращает список.

1 Ответов

Рейтинг:
8

Andy Lanng

Я очень горжусь собой за это:

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

Отделение "списка" от "метода" - это, вероятно, хорошая вещь в любом случае, так что каждый метод не становится слишком сложным

//This is an object in my MembershipUserClass
public T GetCompanySetting<t>(string key)
{
    //Check if the generic type
    if (typeof (T).IsGenericType && typeof (T).GetInterfaces().Contains(typeof (System.Collections.IEnumerable)))
    {
        //Assume the enumerable is generic.  The caller should know this
        var t = typeof (T).GetGenericArguments()[0];

        //Only way to use t is with reflection (this was the knowledge I was missing)
        MethodInfo method = typeof (Configuration).GetMethod("QueryList").MakeGenericMethod(new[] {t});

        //Convert works fine here 
        return (T)method.Invoke(null,new object []{ CompanyId, null, "AccountManagement", key, null});
    }
    //Normal call with T not enumerable.  This method does check for nullable types so it will return the correct default if the setting does not exist.  Again, the caller should know this
    return Configuration.Query<t>(CompanyId, null, "AccountManagement", key);
}

</t></t>


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

Спасибо, что посмотрели, ребята ^_^