📅  最后修改于: 2023-12-03 14:40:16.043000             🧑  作者: Mango
在 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
泛型接口的类型参数。
要使用属性作为泛型约束,需要做以下几个步骤:
以下是一个更复杂的示例:
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# 中的属性可以作为泛型约束,这能够使我们更加精确地控制类型参数的类型。这里给出了一个简单的示例来说明如何使用属性作为泛型约束,这应该能够帮助初学者更好地理解这种技术的概念。