【发布时间】:2014-12-30 12:06:45
【问题描述】:
我有一个带有泛型方法的非泛型类。此方法的泛型类型定义了输出类型,无法从使用中推断出来,因此我必须显式提供泛型类型。有时这种类型是从泛型调用者的方法类型参数传递的,但在一种情况下,我必须自己显式提供它。
问题是当我调用我显式提供的泛型类型方法调用时,它似乎没有被执行并返回一个完全不相关的类型。我无法调试此调用并获得无效结果。但它并没有破坏特别奇怪的执行。当从调用者的泛型方法类型传递泛型类型的其他地方调用相同的方法时,一切似乎都按照定义工作。
我完全不知道发生了什么。
我在接口中的方法定义(并在后面的类中实现):
TRecord Update<TRecord>(int recordId, int? categoryId, string categoryName, string title)
where TRecord : Record;
我的Record 类是非抽象的,并且只有一种类型继承自它:
public class Record : ProtectedEntity
{
...
}
public class RelatedRecord<T> : Record
{
public IList<T> Related { get; private set; }
...
}
我正在调用我的方法:
var record = myRepo.Update<Record>(...);
当执行到这一行时,我按 F11 进行调试,但执行只是跳转到下一句。当我检查我的record 变量时,它不是Record 类型,而是System.String,具有参数categoryName 的值。这意味着某些东西确实被执行了,但它绝对不是我的通用方法的主体。
奇怪的是,在其他任何地方,相同的调用都按预期工作。
如何解释,我做错了什么?
【问题讨论】:
-
看起来很好奇。你能把你的一些代码提取到 MCVE(最小的完整可验证示例)吗?
-
在编译时记录的类型是什么?当您尝试在运行时使用
record访问Record或string的成员时会发生什么? -
record.GetType().FullName返回System.String吗? -
@MarcGravell:是的,它确实返回了
System.String。 :S -
@Robert k;你也可以检查
typeof(Record).FullName吗?那是什么?
标签: c# generics generic-method