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)
以上显然不起作用,所以我想知道如何做到这一点.
谢谢
您将定义第二个非泛型接口,如下所示:
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)