Как использовать универсальный тип в универсальном методе - PullRequest
2 голосов
/ 17 января 2009

EDITED , чтобы показать реальный пример

Как я могу вызвать универсальную функцию из универсального типа, переданного функции? Кажется, это должно быть интуитивно понятно, но я не могу заставить его работать.

Например, можно ли вызвать функцию cache.ResetCache () в LocalDataObjectEngine ниже?

Ошибка, которую я получаю: «Тип T нельзя использовать в качестве параметра»

public interface ISimpleCache<T1>
{    
    ...
    void ResetCache<T>() where T : T1;
}

internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
    ISimpleCache<IBrokeredDataObject> _cache;

    ...

    public void ResetCache<T>() where T : IBrokeredDataObject
    {
        //logic here
    }

    ...
}

public partial class LocalDataObjectEngine : IEngine
{
    ISimpleCache<IBrokeredDataObject> _cache  = new LocalDataObjectEngine_Cache();

    public void ResetCache<T>() where T : IBrokeredDataObject
    {
        _cache.ResetCache<T>();
    }
}

}

Ответы [ 4 ]

1 голос
/ 17 января 2009

Нашел, ссылка Джона Скита на удаление IEngine указала мне в правильном направлении, там было

void ResetCache<T>() where T : IDataObject

в IEngine (IDataObject является базой, если IBrokeredDataObject), который я изменил на

void ResetCache<T>() where T : IBrokeredDataObject

Спасибо всем за терпение моей ошибки, +1 всем вам

1 голос
/ 17 января 2009

Прежде всего, зачем вам нужно указывать универсальный тип в ваших методах? Класс уже указывает универсальный тип, у вас будет доступ к нему в ваших методах:

public interface ISimpleCache<T1>
{    
    ...
    void ResetCache();
}

, что делает класс, реализующий интерфейс, намного проще:

internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
    ISimpleCache<IBrokeredDataObject> _cache;

    ...

    public void ResetCache();
    {
        //logic here with access to IBrokeredDataObject if needed
    }

    ...
}

то же самое относится и к последнему методу, просто вызовите

_cache.ResetCache();

однако, если вам действительно необходимо по каким-либо причинам указать общий тип в методах, сделайте, как показано ниже


Давайте начнем:

Почему бы вам не использовать T1 в методе вместо того, чтобы указывать T, должно быть похоже на T1?

public interface ISimpleCache<T1>
{    
    ...
    void ResetCache<T1>();
}

В вашем LocalDataObjectEngine_Cache вам не нужно снова указывать T, просто используйте IBrokeredDataObject (если вы не реализуете метод и щелкните правой кнопкой мыши на имени интерфейса, чтобы выбрать «реализовать интерфейс», он запишет его ниже:

internal class LocalDataObjectEngine_Cache : ISimpleCache<IBrokeredDataObject>
{
    ISimpleCache<IBrokeredDataObject> _cache;

    ...

    public void ResetCache<IBrokeredDataObject>();
    {
        //logic here
    }

    ...
}

Затем из вашего последнего класса просто вызовите его снова, указав фактический класс, которым вы хотите, чтобы T был:

public partial class LocalDataObjectEngine : IEngine
{
    ISimpleCache<IBrokeredDataObject> _cache  = new LocalDataObjectEngine_Cache();

    public void ResetCache<IBrokeredDataObject>()
    {
        _cache.ResetCache<IBrokeredDataObject>();
    }
}
1 голос
/ 17 января 2009

После удаления ..., ссылки на IEngine и предоставления пустого интерфейса IBrokeredDataObject, ваш код компилируется без проблем.

Пожалуйста, предоставьте короткий, но полный пример, который не компилируется. В идеале, создайте новый проект с одним файлом, поместите туда весь свой код и сделайте его как можно более простым, показывая ту же ошибку. Тогда просто нарежь и вставь сюда. Таким образом, нам не нужно исправлять "..." и т. Д. Или удалять ссылки на интерфейсы, для которых у нас нет объявлений.

1 голос
/ 17 января 2009

Я не уверен, что происходит, если в вашем определении IBrokeredDataObject нет чего-то. То, что вы написали, выглядит правильно и хорошо компилируется для меня.

[Отредактировано, чтобы соответствовать редактированию в OP]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...