c # Общий вызов метода для статической функции - PullRequest
1 голос
/ 22 декабря 2010

У меня есть общий метод в классе следующим образом

    private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>();

    public static Feed GetFeed<T>() where T:Feed
    {    
        lock(_padlock)
        {
            if (!_singletons.ContainsKey(typeof(T))
            {                   
                _singletons[typeof(T)] = typeof(T).GetInstance();
            }
            return _singletons[typeof(T)];          
        }
    }

Здесь Feed - это интерфейс, а Type - это типы классов, которые реализуют интерфейс Feed.GetInstance() - статический метод в этих классах.Что-то не так с typeof(T).GetInstance();?В нем говорится, что System.Type не содержит определения для GetInstance().

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Вы можете использовать Reflection для вызова статического метода следующим образом:

private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>();

public static Feed GetFeed<T>() where T:Feed
{    
    lock(_padlock)
    {
        if (!_singletons.ContainsKey(typeof(T))
        {                   
            return typeof(T).GetMethod("GetInstance", System.Reflection.BindingFlags.Static).Invoke(null,null);

        }
        return _singletons[typeof(T)];          
    }
}
2 голосов
/ 22 декабря 2010

Самый простой способ - использовать ограничение new

private static Dictionary<Type, Feed> _singletons = new Dictionary<Type, Feed>();

public static Feed GetFeed<T>() where T:Feed, new()
{    
    lock(_padlock)
    {
        if (!_singletons.ContainsKey(typeof(T))
        {                   
            _singletons[typeof(T)] = new T();
        }
        return _singletons[typeof(T)];          
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...