背景
我正在使用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
}
答案 0 :(得分:10)
你已经做了什么。如果partial
方法没有实施,则根本不存在。没有“声明存根”,你可能会偶然发现反射。部分方法有一个实现,或者被编译器删除完全。
所以基本上:如果你找不到GetMethod
/ GetMethods
的方法(根据问题使用相应的BindingFlags
) - 那么它就没有实现。< / p>
答案 1 :(得分:2)
作为另一种想法(在编译时很明显,并且不容易出现混淆问题):
// generated code
public partial class Whatever : ISomeInterface<MyTable>
{
//...
}
//somewhere else
public interface ISomeInterface<T>
{
void Insert(T instance);
void Update(T instance);
}
现在编译器不会让用户在没有完全实现此接口的情况下继续进行,可能是在部分类中:
partial class Whatever
{
public void Insert(MyTable instance) {...}
public void Update(MyTable instance) {...}
}
(注意他们仍然可以使用显式接口实现,但是在访问数据时应该自己使用该接口;避免更多的反射)
答案 2 :(得分:0)
当我遇到同样的问题时,我按如下方式解决了这个问题:
var Method = (typeof(Entities))
.GetMethods(System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance)
.FirstOrDefault(x => x.Name == "SomeMethodShouldBeOnPartialClass");
if (Method != null) Method.Invoke(this,null);