用一个例子可以更好地解释这一点。目前我有这样的事情:
public class Car {
internal string SaleCode {get; set;} //Spring, Summer, ...
public string Name {get; set; } //Model name
}
public interface ICarFactory
{
Car GetSummerSaleCar();
Car GetSpringSaleCar();
}
public class FordFactory : ICarFactory
{
public Car GetSummerSaleCar() {
return new Car() {Name="Fiesta"};
}
public Car GetSpringSaleCar() {
return new Car() {Name="Fusion"};
}
}
public class CarProvider {
public void ProduceCars(ICarFactory factory) {
var inventory = new List<Car>();
Car car = null;
car = factory.GetSummerSaleCar();
car.SaleCode = "SMR";
inventory.Add(car);
car = factory.GetSpringSaleCar();
car.SaleCode = "SPG";
inventory.Add(car);
}
}
对于每个方法,汽车的 SaleCode 应始终相同,因此 CarFactory 实现不应设置此值。现在我在 CarProvider 类中设置了它,但我想知道是否有办法将它从界面中取出。我唯一能想到的就是使用一个属性应用于接口内的方法定义,我可以在其中设置类型,但我觉得必须有另一种选择。
想法?
更新
如果您想知道,当我提到为接口中的每个方法添加属性时,这就是我所说的:
public class SaleAttribute : Attribute
{
public string Code { get; set; }
}
public interface ICarFactory
{
[Sale(Code = "SMR")]
Car GetSummerSaleCar();
[Sale(Code = "SPG")]
Car GetSpringSaleCar();
}
public void ProduceCars(ICarFactory factory)
{
var inventory = new List<Car>();
foreach (var method in typeof(ICarFactory).GetMethods())
{
String carType = null;
var attributes = method.GetCustomAttributes(typeof(SaleAttribute), false);
if (attributes.Length == 1)
{
saleCode = ((SaleAttribute)attributes[0]).Name;
Car car = (Car)method.Invoke(factory, null);
car.SaleCode = saleCode;
inventory.Add(car);
}
}
}
这有一个额外的好处,即如果在接口中添加方法,则 CarProvider 不需要修改。缺点显然是与反射相关的开销(性能和维护)。
更新2
我将示例从使用汽车类型更改为销售代码,因为这更好地反映了我的情况。