假设我已经定义了一个具有多个属性的接口,例如:
interface IFailable<T>
{
T Value { get; }
bool Success { get; }
}
我希望类Foo公开多个readonly实例,其中IFailable属性是根据Foo的私有非静态数据计算的,我将如何在c#中执行此操作?
在Java中它非常直观。
这是我在c#中提出的最好的,基于https://stackoverflow.com/a/4770231/146567
首先创建一个包装器:
public class FailableDelegator<T> : IFailable<T>
{
public delegate T valueDelegate();
public delegate bool successDelegate();
private readonly valueDelegate valueHandler;
private readonly successDelegate successHandler;
public T Value { get { return valueHandler(); } }
public bool Success { get { return successHandler(); } }
public FailableDelegator(valueDelegate v, successDelegate s)
{
valueHandler = v;
successHandler = s;
}
}
然后用它来定义Foo构造函数中的属性:
public class Foo
{
private double x = 3;
private double y = -9;
public readonly FailableDelegator<double> xPlusY;
public readonly FailableDelegator<double> sqrtY;
public Foo()
{
xPlusY = new FailableDelegator<double>(() => x + y, () => true);
sqrtY = new FailableDelegator<double>(() => Math.Sqrt(y), () => y>=0);
}
}
我必须将定义放在Foo的构造函数中,因为如果我直接在字段上尝试它,我会收到错误“无法访问静态上下文中的非静态字段”。
我并不热衷于此,因为对于不太重要的例子,你最终会在Foo的构造函数中使用大量代码。