我是新来的泛型实现,需要在2个问题我输入面对具有约束的通用方法的接口的通用类:如何编写实现定义
我有一个接口的ICommand定义为:
public ICommand
{
List<T> Execute<T>() where T : IValidationResult;
IDomain<T> GetDO<T>() where T : IValidationResult;
}
有意将它作为非泛型,因为我必须添加不同命令的集合。
这个界面我希望在一个名为PersistCommand作为一个通用类来实现:
public PersistCommand<TDomainObj,T> : ICommand where TDomainObj : IDomain<T> where T : IValidationResult
{
private TDomainObj _domainObject;//IDomain<T> is an interface
public PersistCommand(TDomainObj TDomainObject)
{
_domainObject = TDomainObject;
}
public IDomain<T> GetDO<T>() where T : IValidationResult
{
return _domainObject as IDomain<T>;
}
public List<T> Execute<T>() where T : IValidationResult
{
//returns a list<T>
}
}
有一个泛型类背后的意图是从类通过这些约束不幸的是不会发生这些泛型方法(不知道为什么?编译时,我得到一个警告:类型参数'T'具有与来自外部类型'PersistCommand'的类型参数相同的名称这是第一个问题。
第二个问题是: 我有不同组的命令,从中继承的InsertCommand,DeleteCommand和UpdateCommand PersistCommand并在单独调用Execute()方法时正常工作。
我有一个是用于多个命令的执行如图所示的命令管理类:
public class CommandManager
{
public virtual IEnumerable<T> Perform<T>(List<ICommand> commandList)
where T : IValidationResult
{
List<T> validationResults = new List<T>();
//fire pre-intent validations
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.GetDomainObject<T>().Validate(command.GetPreIntent()));
}
//fire intent validations
if (validationResults.Count == 0)
{
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.Execute<T>());
}
}
//fire post-intent validations
if (validationResults.Count == 0)
{
foreach (ICommand command in commandList)
{
validationResults.AddRange(command.GetDomainObject<T>().Validate(command.GetPostIntent()));
}
}
return validationResults;
}
}
只要传递给命令和所述CommandManager.Perform方法的类型“T”是相同的,有用。 但是我有一种情况,其中,我们有具有不同“T”作为类型2个域对象:
class Project : IDomain<CustomResult>//CustomResult implements IValidationResult
class Resource : IDomain<AnotherResult>//AnotherResult implements IValidationResult
当我打电话CommandManager.Perform(commandList)它抛出在
异常GetDO方法示出的消息:对象引用未设置到对象”
任何帮助或想法的一个实例来解决这个问题,将不胜感激
喜戴夫, 我试过了,但它并没有编译和得到的错误信息: PersistCommand“不实现接口成员” ICommand.GetDO () –
Chandrasekhar
2009-10-15 13:54:59
我已经更新我的回答覆盖了这一点,这与你如何声明你的界面有关。我还添加了一些关于简化整个事情的部分... HTH – 2009-10-15 14:34:01