如何解决键入Agnostic类以在泛型类中调用泛型和非泛型方法吗?
| 我有以下课程:public class GenericClass<T> : IGenericClass<T> where T : class
{
public GenericClass()
public GenericClass(Entity e)
public IQueryable<T> GenericMethod1()
public IEnumerable<T> GenericMethod2()
public T NonGenericMethod1(T t)
}
这堂课效果很好;但是,我开始遇到一些问题,我必须为我要使用的每种T实例化GenericClass的另一个实例,这变得有些疯狂了。我可以创建某种抽象来简化此过程吗?
我正朝着这个方向前进,但是我无法确定这是否是正确的选择,或者是否可以使用更好的设计模式。另外,这两个调用调用根本无法正确运行。
public class TestClass
{
private Type type;
public object Invoke(string method,object obj)
{
type = obj.GetType();
MethodInfo m = typeof(GenericClass<>).GetMethod(method);
var result = new object();
if(m.IsGenericMethod == true)
result = m.MakeGenericMethod(type).Invoke(null,new object[] { obj });
else
result = m.Invoke(null,new object[] { obj });
return result;
}
}
TIA
解决方法
但是我开始遇到问题,我必须为我要使用的每种类型T实例化GenericClass的另一个实例,这变得有些疯狂了
如果没有GenericClass的某些实现,很难猜测...但是我看到了构造函数和方法-没有属性(也没有字段?)。
在这种情况下,您可能希望使GenericClass成为具有静态方法的静态类。然后就不允许实例化它,可以直接从类型中调用方法:
public static class GenericClass
{
public static IQueryable<T> GenericMethod1<T>() where T:class
public static IEnumerable<T> GenericMethod2<T>() where T:class
public static object NonGenericMethod1(object t)
}
致电者
IQueryable<Customer> query = GenericClass.GenericMethod1<Customer>();
IEnumerable<Customer> items = GenericClass.GenericMethod2<Customer>();
Customer c = (Customer) GenericClass.NonGenericMethod1(customerInstance);
也许有属性或字段,但是它们不依赖于T,则可以将泛型责任移到方法而不是类上。
现在,您可以拥有一个实例,该实例可以处理要向其抛出的所有T \。
public class GenericClass : IGenericClass
{
public IQueryable<T> GenericMethod1<T>() where T:class
public IEnumerable<T> GenericMethod2<T>() where T:class
public object NonGenericMethod1(object t)
}
对于这个答案的通用性,我深表歉意,但这是由于问题的通用性。
,我认为这种方法行不通。主要问题是,您试图基于类型创建泛型方法,以避免实例化适当的“ 5”实例。但是,ѭ6失败的原因是您将in7作为目标对象传递,即使它们是实例方法。使它们工作的方法是构造一个适当的ѭ5的实例,但这当然是您要避免的。
如果您想走这条反思路线(因此您仍然拥有集中的施工位置),则可以使用以下代码通过反射来做到这一点:
Type specificType = typeof(GenericClass<>).MakeGenericType(new Type[] { type });
var specificInstance = Activator.CreateInstance(specificType);
然后,您可以将specificInstance
作为第一个参数传递给Invoke()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。