【发布时间】:2009-08-02 15:08:34
【问题描述】:
我有一个 LINQ 对象,其中添加了一个附加方法。该类没有一次性属性或方法,但 FxCop 引发错误“拥有一次性字段的类型应该是一次性的”并引用该类。
我已经将代码减少到这里,但仍然收到错误:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
但是,如果我删除了 from 子句中的任何一个,FxCop 就会停止给出错误:
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from pageTag in context.VirtualWikiPageTags
select new {};
return null;
}
}
}
或者
partial class WikiPage
{
public PagePermissionSet GetUserPermissions(Guid? userId) {
using (WikiTomeDataContext context = new WikiTomeDataContext()) {
var permissions =
from wiki in context.Wikis
select new {};
return null;
}
}
}
PagePermissionSet 不是一次性的。
这是误报吗?或者 LINQ 代码是否以某种方式在类上生成了一次性字段?如果不是误报,FxCop 建议我实现 IDisposable 接口,但是在 Dispose 方法中我会做什么?
编辑: 完整的 FxCop 错误是:
“在 'WikiPage' 上实现 IDisposable,因为它 创建以下 IDisposable 类型的成员: 'WikiTomeDataContext'。如果 'WikiPage' 以前有 已发货,添加了实现 IDisposable 的新成员 这种类型被认为是对现有的重大更改 消费者。”
编辑 2: 这是引发错误的反汇编代码:
public PagePermissionSet GetUserPermissions(Guid? userId)
{
using (WikiTomeDataContext context = new WikiTomeDataContext())
{
ParameterExpression CS$0$0001;
ParameterExpression CS$0$0003;
var permissions = context.Wikis.SelectMany(Expression.Lambda<Func<Wiki, IEnumerable<VirtualWikiPageTag>>>(Expression.Property(Expression.Constant(context), (MethodInfo) methodof(WikiTomeDataContext.get_VirtualWikiPageTags)), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki") }), Expression.Lambda(Expression.New((ConstructorInfo) methodof(<>f__AnonymousType8..ctor), new Expression[0], new MethodInfo[0]), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki"), CS$0$0003 = Expression.Parameter(typeof(VirtualWikiPageTag), "pageTag") }));
return null;
}
}
编辑 3: 似乎确实有一个包含对 DataContext 的引用的闭包类。这是它的反汇编代码:
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public WikiTomeDataContext context;
// Methods
public <>c__DisplayClass1();
}
【问题讨论】:
标签: linq idisposable fxcop