0

嗨,我是 C# 中的接口和抽象类的新手,我遇到了一个问题我正在创建一个示例应用程序,我需要将详细信息保存到 db 保存功能对于应用程序很常见,只是对象不同例如。void Save(User data);我的void Save(Admin data)问题是如何动态指定用户和管理员类

4

3 回答 3

1

使用泛型

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);

对签名的约束 iewhere T: class规定只有类可以作为参数传递。但是, givenstring实际上是 .NET 中的一种特殊类型的类,您可以在技术上调用

dbClass.Save("string")

如果您想完全控制类型,您可以让您的类从基类派生或实现特定接口并将其用作约束,例如

public class Entity
{
   ...
}

public class Admin : Entity
{
}

public class User : Entity
{
}

然后您将约束更新为where T : Entity,这将确保您只能将实体传递给该Save方法。

于 2013-07-05T10:26:41.693 回答
0

我可以看到两个选项:

  1. 创建UserAdmin实现相同的接口(或继承相同的抽象类),例如IDbEntity. 您的方法将是:

    public void Save(IDbEntity data)
    
  2. 创建一个保存数据的私有泛型方法,然后创建两个公共包装器,每个类型一个:

    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);
    }
    
于 2013-07-05T10:30:38.340 回答
0

为您的保存方法使用泛型

public void Save<T>(T data) where T: MyAbstractClass
{
    // your save method code here
}

您可以使用反射来确定您要保存的课程是您需要特定于您的课程之一的东西,Admin还是User.

Admin并且User必须继承自同一个抽象类

于 2013-07-05T10:30:48.837 回答