如何在不知道确切类型声明的情况下执行通用接口方法

Pri*_*Psi 4 c# generics interface

我有一个声明如下的接口

public interface ILoadObjects<T> where T : class
{
    List<T> LoadBySearch();
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个声明如下的类

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

现在我想做的是,使用在该类的接口中定义的方法,而不必知道该类是什么.

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

以上显然不起作用,所以我想知道如何做到这一点.

谢谢

Ste*_*ven 5

您将定义第二个非泛型接口,如下所示:

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

public interface ILoadObjects
{
    IList LoadBySearch();
}
Run Code Online (Sandbox Code Playgroud)

并按如下方式声明您的课程:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable<T>IEnumerable接口相同的方式工作.

现在您可以ILoadObjects.LoadBySearch像这样调用方法:

((ILoadObjects)objectSource).LoadBySearch();
Run Code Online (Sandbox Code Playgroud)