Как выполнить метод универсального интерфейса, не зная точного объявления типа - PullRequest
4 голосов
/ 30 августа 2010

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

public interface ILoadObjects<T> where T : class
{
    List<T> LoadBySearch();
}

Тогда у меня есть класс, объявленный следующим образом

public class MyTestClass : ILoadObjects<MyTestClass>
{
    List<MyTestClass> ILoadObjects<MyTestClass>.LoadBySearch()
    {
        List<MyTestClass> list = new List<MyTestClass>();
        list.Add(new MyTestClass());
        return list;
    }
}

Теперь я хотел бы использовать этот метод, определенный в интерфейсе, для этого класса, не зная, что это за класс.

public void ExecuteTestClassMethod()
{
    MyTestClass testObject = new MyTestClass();
    object objectSource = testObject;
    object results = ((ILoadObjects<>)objectSource).LoadBySearch();
    {... do something with results ...}
}

Выше явно не работает, поэтому я хотел бы знать, как сделать что-то подобное.

Спасибо

1 Ответ

5 голосов
/ 30 августа 2010

Вам нужно будет определить второй неуниверсальный интерфейс, например так:

public interface ILoadObjects<T> : ILoadObjects where T : class
{
    List<T> LoadBySearch();
}

public interface ILoadObjects
{
    IList LoadBySearch();
}

И объявите свой класс следующим образом:

public class MyTestClass : ILoadObjects<MyTestClass>
{
    public List<MyTestClass> LoadBySearch()
    {
        List<MyTestClass> list = new List<MyTestClass>();
        list.Add(new MyTestClass());
        return list;
    }

    IList ILoadObjects.LoadBySearch()
    {
        return this.LoadBySearch();
    }
}

IEnumerable<T> и IEnumerableинтерфейсы работают одинаково.

Теперь вы можете вызывать метод ILoadObjects.LoadBySearch следующим образом:

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