Tre*_*ews 7 c# generics inheritance
我正在编写一个程序并发现了一些常见的行为,所以我认为这对于抽象基类来说是一个合适的用例.
这是我的抽象基类的简化版本:
public abstract class BehaviorClass<T> where T: IDomainObj
{
protected BehaviorClass(var x){...}
public abstract void Create(List<T> list, out string message);
public abstract void Delete(List<T> list, out string message);
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的派生类的简化版本:
public class DbSheets : BehaviorClass<Sheet>
{
public override void Create(List<Sheet> sheets, out string message){...}
public override void Delete(List<Sheet> sheets, out string message){...}
...
}
Run Code Online (Sandbox Code Playgroud)
这是我想对派生类进行操作的通用方法:
public void Import<DbObj>() where DbObj : BehaviorClass<IDomainObj>
{
var instance = (DbObj)Activator.CreateInstance(typeof(DbObj), DbAccessor);
// STEP 1: Remove existing values
var existingValues = instance.Read();
instance.Delete(existingValues, out message);
// STEP 2: Create new IDomainObjects
var domainObjects = //LINQ Query.ToList();
// STEP 3: Add new IDomainObjects to the instance
instance.Create(domainObjects, message);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,在我尝试调用导入方法之前,所有内容都可以正常编译.
internal class Program
{
...
intermediary.Import<DbSheets>();
...
}
Run Code Online (Sandbox Code Playgroud)
这是尝试调用Import方法时出现的结果错误
类型'namespace.DbSheets'不能在泛型类型或方法中用作类型参数'DbObj'
'intermediary.Import<DbObj>()'.没有从"namespace.DbSheets"到的隐式引用转换'namespace.BehaviorClass<IDomainObj>'.
我的思维过程总结:实质上,我想要一个泛型方法只对从BehaviorClass派生的类进行操作,因为我可以可靠地知道它们共享一组常用的方法和属性.Resharper说如果删除Import方法的泛型约束,代码将编译.我宁愿不删除该约束,因为此方法特别依赖于此共享行为将存在的事实.
注意:我使用IDomainObj接口作为将泛型参数限制为特定类集的方法.此时它不包含任何特定功能.
在我看来,您需要两个泛型类型参数:
public void Import<TBehavior, TDomain>()
where TBehavior : BehaviorClass<TDomain>
where TDomain : IDomainObj
{
var instance = (TBehavior) Activator.CreateInstance(typeof(TBehavior), DbAccessor);
// STEP 1: Remove existing values
var existingValues = instance.Read();
instance.Delete(existingValues, out message);
// STEP 2: Create new IDomainObjects
var domainObjects = //LINQ Query.ToList();
// STEP 3: Add new IDomainObjects to the instance
instance.Create(domainObjects, message);
}
Run Code Online (Sandbox Code Playgroud)
现在您应该可以调用:
Import<DbSheets, Sheet>();
Run Code Online (Sandbox Code Playgroud)
之前的问题是 aDbSheets 不是a -例如BehaviorClass<IDomainObj>你不能调用。sheets.Create(new List<IDomainObj>())
必须指定两个类型参数有点笨拙,并且可能有方法可以避免它,但我认为这是最简单的开始方法。