我有一个为列表对象生成xml的函数:
public XDocument ToXML()
{
foreach (var row in this)
{
var xml = row.ToXml();
template.Root.Add(xml);
}
return template;
}
Run Code Online (Sandbox Code Playgroud)
该template.ToString()读取:<RootElement xmlns="urn:testTools">
该XML内容如下:<Example><SubElement>testData</SubElement></Example>
add函数执行完template.ToString()后读取:<RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>
所以由于某种原因,添加了一个空命名空间,我怎么能阻止它这样做呢?
我刚遇到这种情况,我认为这是一个使用default关键字的好机会.但它没有编译,我想不出为什么.以下示例说明了我的问题:
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result != default(TDataSource);
}
}
Run Code Online (Sandbox Code Playgroud)
你会在第8行得到一个错误("运算符'=='不能应用于'TDataSource'和'TDataSource'类型的操作数.").我认为使用default关键字将消除引用类型和值类型之间的任何比较问题.
添加将TDataSource限制为引用类型的通用约束使得这段代码可以编译.
有人可以解释为什么编译器不会为我解决这个问题吗?只是不够聪明才能看到这会起作用吗?
这是相关的: 不能将operator ==应用于C#中的泛型类型?
[编辑] SLaks的答案给了我一些灵感,'=='运算符不起作用,但Equals函数应该.
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result.Equals(default(TDataSource));
}
}
Run Code Online (Sandbox Code Playgroud)
这个编译会正常吗?
我得到了一些带有扩展方法的静态类,它们使用存储库模式为实体添加"业务逻辑".
现在有时我需要IRepository在这些扩展函数中创建一个新的.
我目前正在通过我正在扩展的对象访问我的Ninject内核来解决它,但它真的很难看:
public static IEnumerable<ISomething> GetSomethings(this IEntity entity)
{
using (var dataContext = entity.kernel.Get<IDataContext>())
return dataContext.Repository<ISomething>().ToList();
}
Run Code Online (Sandbox Code Playgroud)
我还可以创建一个静态构造函数,以某种方式从工厂访问Ninject内核,Ninject 2中是否已有基础结构?
有人知道更好的解决方案吗?有没有人对这种方式有一些意见来实现业务逻辑.