泛型类、扩展方法、属性与方法

知识点回顾:

在做sqlhelper的单元测试类时,遇到一个地方要配置临时数据库,使用了一个语句来配置。

private DbContextOptions<AppDbContext> _context;
public SqlHelperTests()
{
    //使用InMenory数据库配置DBContext
    _context = new DbContextOptionsBuilder<AppDbContext>).UseInMemoryDatabase(databaseName: "T_dicomPatientMsg").Options;
}

仔细剖析一个这个长句子

1.泛型类

第一部分为 new DbContextOptionsBuilder<AppDbContext>()

new了一个DbContextOptionsBuilder的泛型类实例

什么是泛型类?

泛型类是类的一种扩展,为了更高的重用性和灵活性。类型参数通常用<T>来标识。

如List<T>就是一个泛型类,可以存储任何类型的元素,如List<int>、List<string>

定义泛型类

public class OptionBuilder<T>{}

还可以限制T泛型,添加泛型约束

public class OptionBuilder<T> where T: TestClass

这样传入的类T,就只能时TestClass的类或它的子类

也可以在调用实例时,限制T的类型

public class OptionBuilder<T>{}

OptionBuilder<T> option = new OptionBuilder<T>() where T: TestClass
 


使用泛型类的好处

public class Box<T>
{
    private T _value;

    public Box(T value)
    {
        _value = value;
    }

    public T GetValue()
    {
        return _value;
    }
}


// 传Int型
Box<int> intBox = new Box<int>(123);
int value = intBox.GetValue();

//传String
Box<string> stringBox = new Box<string>("nihao");
string value = stringBox.GetValue();

可以传任意类型。

2.扩展方法

第二部分 UseInMemoryDatabase(databaseName: "T_dicomPatientMsg")是一个扩展方法

为什么要用扩展函数

当你完成一个类如TestClass的封装后,如果你需要添加一个新的方法,但是又不想破坏原有类的定义,可以使用扩展方法

扩展方法的定义

首先扩展方法必须是静态方法,它的第一个参数必须是this关键字,标识它要扩展的类

//需要扩展的类
public class TestClass
{
    //定义一个实例方法
    public void Print(){}
}

//定义扩展方法
public static bool TestClassExtensions
{
    public static bool IsNullOrEmpty(this TestClass testClass, string str )
    {
        return string.IsNullOrEmpty(str);
    }
}

//调用扩展方法,扩展方法的调用,其实跟示例方法是一样的,虽然他是静态方法
TestClass testClass = new TestClass();
//调用类内的实例方法
test.Print();
//调用扩展方法
test.IsNullOrEmpty();

扩展方法的好处:

当无法修改现有的代码时,可以使用扩展方法

保持类的简洁

注意:不要滥用扩展方法,且不要跟类内的实例方法存在命名冲突

3.属性和方法

.Options ,这里是调用了DbContextOptionsBuilder类内的Options属性,该属性里设置了get 访问器,可以返回配置类的实例

其实这里使用属性或者方法都是可以的,举例

//使用属性
public class TestClass
{
    private Config _config;
    
    public string Options{ get {retrun _config};}

}

//使用方法
public class TestClass
{
    private Config _config;
    
    public string GetOption()
    {
         retrun _config;
    }

}

使用哪个取决于习惯, 属性一般用于表示数据状态,方法更偏向于操作和行为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值