- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在泛型类中有一个泛型方法。在此方法内部,如果未映射方法的泛型参数类型,但父类型,我需要为父类型调用相同的方法。对于这两位代码,我得到了不同的结果,尽管我希望它们是相同的。
这成功了:
MethodInfo methodInfo2 = this.GetType().GetMethods()[9]; // this is the correct one.
methodInfo2 = methodInfo2.MakeGenericMethod(mappedType);
这会崩溃:
MethodInfo methodInfo1 = System.Reflection.MethodBase.GetCurrentMethod() as MethodInfo;
methodInfo1 = methodInfo1.MakeGenericMethod(mappedType);
除了这个异常(exception):
GenericArguments[0], 'GenericClassConstraintAbstract.Abstract', on 'System.Collections.Generic.IList`1[Entity] GetEntities[Entity](System.Linq.Expressions.Expression`1[System.Func`2[Entity,System.Boolean]], Sbu.Sbro.Common.Core.Pagination.Paginator`1[Entity])' violates the constraint of type 'Entity'.
如果我在调试器监视中添加 methodInfo1 == methodInfo2
,我会得到 false
,但我不知道有什么区别。我可能比使用 [9]
选择正确的方法并以这种方式执行它更聪明,但我也想知道为什么崩溃的版本会这样做。
有什么想法吗?
编辑:现在有更好的例子:
interface BaseInterface
{ }
interface MyInterface : BaseInterface
{ }
abstract class Abstract : MyInterface
{ }
class Concrete : Abstract, MyInterface
{ }
class ProblemClass<GenericType> where GenericType : BaseInterface
{
public virtual IList<Entity> ProblemMethod<Entity>() where Entity : class, GenericType
{
if (typeof(Entity) == typeof(Concrete))
{
MethodInfo methodInfo = System.Reflection.MethodBase.GetCurrentMethod() as MethodInfo;
var t1 = this.GetType(); // perhaps the problem resides in
var t2 = methodInfo.DeclaringType; // these two not being equal?
methodInfo = methodInfo.MakeGenericMethod(typeof(Abstract));
return (methodInfo.Invoke(this, new Object[] { }) as IList).OfType<Entity>().ToList();
}
else
{
return new List<Entity>();
}
}
}
class Program
{
static void Main(string[] args)
{
new ProblemClass<MyInterface>().ProblemMethod<Concrete>();
}
}
最佳答案
因此,问题在于声明类型是开放泛型,而泛型方法中的约束依赖于类型中的泛型类型参数。
下面的代码解决了这个问题:
MethodInfo methodInfo = System.Reflection.MethodBase.GetCurrentMethod() as MethodInfo;
methodInfo = this.GetType().GetMethod(methodInfo.Name, methodInfo.GetParameters().Select(p => p.ParameterType).ToArray());
methodInfo = methodInfo.MakeGenericMethod(typeof(Abstract));
return (methodInfo.Invoke(this, new Object[] { }) as IList).OfType<Entity>().ToList();
见http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx中的备注.
关于.net - 泛型泛型方法调用MethodBase.GetCurrentMethod的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303128/
我正在从 C++ 过渡到 C#,我有一个方法调用让我感到困惑。我想我也许能猜出它的作用,但如果专家能直接告诉我,我将不胜感激: WDResult returnValue = (WDResult)Inv
public static void Main(string[] args) { Action a = () => Console.WriteLine(MethodInfo.GetCurren
我编写了一个日志类和一个函数,如下代码所示: Log(System.Reflection.MethodBase methodBase, string message) 每次我记录一些东西时,我也会记录
是否有等效于 MethodBase.GetCurrentMethod 的可移植类库? 我是 PCL 的新手。我只是在研究是否可以使用 PCL 来保存一些肯定会在 Silverlight 上使用并且可能
出于日志记录的目的,我们应用程序中的一些方法包括以下行: Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().Decla
有什么区别以及对代码的影响? 关于性能和限制,什么更适合? 新属性: - [调用文件路径属性] - [CallerMemberName] - [来电号码] 现在它们在 .NET 4 中也可用(它很容易
我正在为try/catch语句创建一个简单的日志记录方法(没什么花哨的)。我要包括类名称和引发异常的方法。 有两种获取信息的方法。一种使用MethodBase.GetCurrentMethod()和异
我是一名优秀的程序员,十分优秀!