📜  csharp 属性作为泛型约束 - C# (1)

📅  最后修改于: 2023-12-03 14:40:16.043000             🧑  作者: Mango

C# 属性作为泛型约束

在 C# 中,属性可以作为泛型约束,以限制泛型类型参数的类型。

在定义泛型类型参数时,可以通过属性来限制其类型,从而达到更加精确的参数类型限制。这使得我们能够使用属性来执行更高级的类型检查。

属性作为泛型约束的示例

下面是一个简单的示例,它说明了如何使用属性作为泛型约束:

public interface IEntity
{
    int Id { get; }
}

public interface IRepository<T> where T : IEntity
{
    T GetById(int id);
}

在上面的示例中,我们定义了一个 IEntity 接口,它包含一个只读的 Id 属性。然后,我们定义了另一个接口 IRepository<T>,它是泛型接口,并且要求泛型类型参数 T 必须实现 IEntity 接口。

这表示,任何实现了 IEntity 接口的类型都可以用作 IRepository 泛型接口的类型参数。

如何使用属性作为泛型约束

要使用属性作为泛型约束,需要做以下几个步骤:

  1. 定义一个接口或类,该接口或类包含一个或多个属性。
  2. 对泛型类型参数添加约束,使其满足相应的属性限制。

以下是一个更复杂的示例:

public interface ITaxable
{
    decimal TaxRate { get; }
}

public class ShoppingCart<T> where T : ITaxable
{
    private readonly List<T> _items;

    public ShoppingCart()
    {
        _items = new List<T>();
    }

    public void Add(T item)
    {
        _items.Add(item);
    }

    public decimal Total()
    {
        decimal total = 0.0M;

        foreach (T item in _items)
        {
            total += item.TaxRate * item.Price;
        }

        return total;
    }
}

public class Book : ITaxable
{
    public decimal Price { get; set; }
    
    public decimal TaxRate
    {
        get { return 0.05M; }
    }
}

public class Clothes : ITaxable
{
    public decimal Price { get; set; }
    
    public decimal TaxRate
    {
        get { return 0.1M; }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var cart = new ShoppingCart<ITaxable>();
        
        cart.Add(new Book { Price = 20.0M });
        cart.Add(new Clothes { Price = 50.0M });
        
        Console.WriteLine(cart.Total());
    }
}

在上面的示例中,我们定义了一个 ITaxable 接口,它包含一个只读的 TaxRate 属性。然后,我们定义了一个泛型类 ShoppingCart<T>,它是一个购物车,它需要一个泛型类型参数 T,并且该类型必须实现 ITaxable 接口。

ShoppingCart<T> 类中,我们有一个 _items 列表,它用于存储添加到购物车中的所有 T 对象。Total() 方法将遍历 _items 列表,并计算购物车中所有物品的税前总价。对于每个物品,我们将应用其 TaxRate 属性来计算其税金,然后将其添加到总价中。最后,我们将总价作为方法的返回值。

Program.Main() 方法中,我们创建了一个 ShoppingCart<ITaxable> 对象,并将两个具有不同税率的对象添加到它里面。最后,我们调用 Total() 方法来计算购物车的总价,并打印结果。

结论

C# 中的属性可以作为泛型约束,这能够使我们更加精确地控制类型参数的类型。这里给出了一个简单的示例来说明如何使用属性作为泛型约束,这应该能够帮助初学者更好地理解这种技术的概念。