您可以使用构造函数链接:
public class MyClass
{
public MyClass(IService service, IEnumerable<int> values)
: this(service, values, valus.FirstOrDefault(i => i == service.GetDefaultValue()) {}
public MyClass(IService service, IEnumerable<int> values, int value)
{
Service = service;
Values = values;
Value = value;
}
}
请注意,我已将 values 参数指定为 IEnumerable 而不是 List。这允许 ctor 接受比列表更多的类型。如果您的成员是 List 类型,则必须在构造函数中调用 ToList() 方法。
不过,我还建议您将 Values 属性指定为 IEnumerable 而不是 List。
编辑:更改问题中的代码后,另一个建议可能是使用私有构造函数和(重载)静态工厂方法。这样做表明(恕我直言)创建这样的实例是一个更“昂贵”的操作,而不是调用简单的构造函数,因为您正在调用“DataService”上的方法,这表明您可能会去数据库初始化你的对象?
public class NewExpenseViewModel
{
private readonly IDataService DataService;
public ExpenseType ExpenseType { get; set; }
CollectionViewSource VatRatesSource { get; set; }
public ICollectionView VatRatesView => VatRatesSource.View;
private NewExpenseViewModel(ServiceProvider serviceProvider, ExpenseType expenseType, VatRate vatRate)
{
DataService = serviceProvider.GetService<IDataService>();
ExpenseType = expenseType;
VatRatesSource = new CollectionViewSource() { Source = DataService.GetVatRates() };
VatRate = vatRate;
}
public static NewExpenseViewModel Create(ServiceProvider sp, ExpenseType expenseType, VatRate vat)
{
DataService = serviceProvider.GetService<IDataService>();
ExpenseType = expenseType;
VatRatesSource = new CollectionViewSource() { Source = DataService.GetVatRates() };
VatRate = vatRate;
}
public static NewExpenseViewModel Create(ServiceProvider sp, ExpenseType expenseType)
{
var instance = Create(sp, expenseType, 0);
instance.Vat =
((IEnumerable<VatRate>)VatRatesSource.Source).FirstOrDefault(v => v.VatRateID.Equals(ExpenseType.SuggestedVatRateID));
return instance;
}
}