【发布时间】:2013-11-13 13:12:45
【问题描述】:
背景
我正在使用 Linq to SQL,因此生成的 DBML 文件包含自动生成的类。生成过程的一部分为某些操作创建部分方法,在我的例子中,我感兴趣的两种方法与表记录的插入和更新有关。这些部分方法是根据 DBML 设计器中创建的每个表生成的,例如:
partial void InsertMyTable(MyTable instance);
partial void UpdateMyTable(MyTable instance);
现在,我的应用程序设计的一部分要求始终为每个表实现这两个部分方法。 (它们本质上用于为正在插入/更新的记录添加时间戳)。
要求
我有一个单元测试项目,虽然这可能不是常见的做法,但我想包括一些测试,以确保某些事情已正确实施。在这种情况下,我想确保开发人员记得实现上面提到的部分方法(我不关心实际的实现,只关心它们已经实现了)。
问题
我需要做的是使用反射来检查每个部分方法是否已实现,但我无法确定如何确定。
尝试的努力
到目前为止,我已经设法获得了包含在数据上下文中的方法列表,并且我能够将其与每个表的预期方法进行比较。问题是我找不到方法来确定给定的部分方法是否真的有实现:
var methods = (typeof(MyDataContext)).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var method in methods)
{
Console.WriteLine(method.Name);
//how to check if method is implemented, or just an unimplemented partial
}
【问题讨论】:
-
提供
throw new NotImplementedException()的默认实现不是更容易吗? -
@James:partial 方法是自动生成的,这意味着开发人员需要记住每次向 DBML 设计器添加新表时都要实现它
-
或者创建一个属性,将其附加到已实现的方法上,看看它是否存在于您的检查中。
-
部分方法对我来说是新的,但似乎在运行时,如果它没有被实现,它不会在 GetMethods 调用中返回,因为编译器根据@987654321丢弃未实现的部分@
-
BindingFlags.DeclaredOnly 应该忽略继承的成员
标签: c# reflection partial-methods