我会回答我自己的问题,因为我终于能够根据我的需要来解决这个问题。
使用工厂模式,我能够制作一种新方法CreateNew
public IExposableControlValue<T> CreateNew<T>(ErrorProvider errorProvider, Control control, Func<T> get, Action<T> set) {
var param1 = new ConstructorArgument("errorControl", errorProvider);
var param2 = new ConstructorArgument("control", control);
var exposableControlValue = resolutionRoot.Get<IExposableControlValue<T>>(param1, param2);
exposableControlValue.CreateSet(set);
exposableControlValue.CreateGet(get);
return exposableControlValue;
}
我正在使用ninject
,但概念是相同的。本质上,我要求用户提供一些依赖项来创建此类的新实例。然后,当我想真正公开内部 Generic 值时,我会这样做:
Func<T> get;
Action<T> set;
public ExposableControlValue(ErrorProvider errorControl, Control control) {
...configure my dependcies
}
public T Value { get { return get.Invoke(); } set { set.Invoke(value); } }
最后,当我实际使用工厂CreateNew
方法时,我会根据我需要的属性传入一些参数
_forSomethingBackingField = exposableControlFactory.CreateNew<decimal>(errorProvider, numericUpDownForSomething,
() => { return numericUpDownForSomething.Value; }, (decimal d) => { numericUpDownForSomething.Value = d; });
这decimal
是我对numeric up down
. 如果您想使用 a 来执行此操作string
,您只需将string
其用作通用参数并传递(string s) = > someControlWithTextProperty.Text = s
给匿名方法参数即可。当然,这样做您需要确保您使用的属性实际上是您传递的类型。