嗨,我是C#中的接口和抽象类的新手,我遇到了一个问题,我正在创建一个示例应用程序,我需要将详细信息保存到db中,保存功能对于app只有对象是常见的例如,是不同的。 void Save(User data);
和void Save(Admin data)
我的问题是如何动态指定用户和管理员类
答案 0 :(得分:1)
使用Generics
public void Save<T>(T data) where T: class
{
...
}
这将允许您为任何类型调用Save
方法,例如
Admin admin = new Admin();
User user = new User();
dbClass.Save(admin); // T is implicitly inferred by the parameter type
dbClass.Save(user);
对签名的约束,即where T: class
,规定只能将类作为参数传递。但是,鉴于string
实际上是.NET中特殊类型的类,您可以在技术上调用
dbClass.Save("string")
如果要完全控制类型,可以让类从基类派生或实现特定接口,并将其用作约束,例如。
public class Entity
{
...
}
public class Admin : Entity
{
}
public class User : Entity
{
}
然后您将约束更新为where T : Entity
,这将确保您只能将实体传递给Save
方法。
答案 1 :(得分:0)
我可以看到两个选项:
让User
和Admin
实现相同的接口(或继承相同的抽象类),类似于IDbEntity
。那么你的方法就是:
public void Save(IDbEntity data)
创建一个保存数据的私有泛型方法,然后创建两个公共包装器,每种类型一个:
private void Save<T>(T data)
{
// your implementation here
}
public void Save(User data)
{
Save<User>(data);
}
public void Save(Admin data)
{
Save<Admin>(data);
}
答案 2 :(得分:0)
使用泛型保存方法
public void Save<T>(T data) where T: MyAbstractClass
{
// your save method code here
}
您可以使用反思来确定您要保存的课程,您需要某个特定于某个班级Admin
或User
的内容。
Admin
和User
必须从相同的抽象类继承