有没有办法在 C# 中派生或扩展属性?
Is there a way to derive or extend properties in C#?
我有一个 属性,我想在其中系统地转换值,并且我有一组非常大的属性,所以不要有以下内容:
class myClass
{
private Double _Length;
public Double Length { get { return convert(_Length); } set { _Length = convertBack(value); }}
private Double _Height;
public Double Height{ get { return convert(_Height); } set { _Height= convertBack(value); }}
private Double _Width;
public Double Width{ get { return convert(_Width); } set { _Width= convertBack(value); }}
...
Double convert(Double base_value) { do work to return converted_value; }
Double unconvert(Double converted_value) { to work to return base_value; }
}
我想做这样的事情来减少代码污染和冗余
class myBaseClass
{
class DoublePropertyConverter extends Property
{
public Double get { return convert(this); }
public Double set { this = unconvert(value); }
}
Double convert(Double base_value) { do work to return converted_value; }
Double unconvert(Double converted_value) { to work to return base_value; }
}
class myClass : public myBaseClass
{
[DoublePropertyConverter]
public Double Length { get; set;}
[DoublePropertyConverter]
public Double Height{ get; set;}
[DoublePropertyConverter]
public Double Width{ get; set;}
...
}
这或类似的事情完全可能吗?
无法按照您描述的方式“扩展 属性”,不。
但是创建一个表示来自和两个其他值的转换的新类型非常容易。例如,DateTime
和 TimeSpan
等类型都只是 long
的包装器,可为您处理到不同语义值的转换。老实说,这听起来像你 应该 有一个新类型,因为你有一个消费者想要以一种方式对待的价值,但它实际上在内存中表示为其他东西,并且在许多超出获取和设置 属性 值范围的情况下,类型非常擅长实现这一点。
public class Foo
{
public Foo(double value)
{
underlyingValue = FromDouble(value);
}
private readonly object underlyingValue;
public double Value => ToDouble(underlyingValue);
public static implicit operator double(Foo foo) => ToDouble(foo.underlyingValue);
public static implicit operator Foo(double value) => new Foo(value);
private static double ToDouble(object underlyingVvalue)
{
throw new NotImplementedException();
}
private static object FromDouble(double value)
{
throw new NotImplementedException();
}
}
类型中的基础字段可以是您要转换的任何内容to/from,然后您可以在一处定义转换逻辑。
我有一个 属性,我想在其中系统地转换值,并且我有一组非常大的属性,所以不要有以下内容:
class myClass
{
private Double _Length;
public Double Length { get { return convert(_Length); } set { _Length = convertBack(value); }}
private Double _Height;
public Double Height{ get { return convert(_Height); } set { _Height= convertBack(value); }}
private Double _Width;
public Double Width{ get { return convert(_Width); } set { _Width= convertBack(value); }}
...
Double convert(Double base_value) { do work to return converted_value; }
Double unconvert(Double converted_value) { to work to return base_value; }
}
我想做这样的事情来减少代码污染和冗余
class myBaseClass
{
class DoublePropertyConverter extends Property
{
public Double get { return convert(this); }
public Double set { this = unconvert(value); }
}
Double convert(Double base_value) { do work to return converted_value; }
Double unconvert(Double converted_value) { to work to return base_value; }
}
class myClass : public myBaseClass
{
[DoublePropertyConverter]
public Double Length { get; set;}
[DoublePropertyConverter]
public Double Height{ get; set;}
[DoublePropertyConverter]
public Double Width{ get; set;}
...
}
这或类似的事情完全可能吗?
无法按照您描述的方式“扩展 属性”,不。
但是创建一个表示来自和两个其他值的转换的新类型非常容易。例如,DateTime
和 TimeSpan
等类型都只是 long
的包装器,可为您处理到不同语义值的转换。老实说,这听起来像你 应该 有一个新类型,因为你有一个消费者想要以一种方式对待的价值,但它实际上在内存中表示为其他东西,并且在许多超出获取和设置 属性 值范围的情况下,类型非常擅长实现这一点。
public class Foo
{
public Foo(double value)
{
underlyingValue = FromDouble(value);
}
private readonly object underlyingValue;
public double Value => ToDouble(underlyingValue);
public static implicit operator double(Foo foo) => ToDouble(foo.underlyingValue);
public static implicit operator Foo(double value) => new Foo(value);
private static double ToDouble(object underlyingVvalue)
{
throw new NotImplementedException();
}
private static object FromDouble(double value)
{
throw new NotImplementedException();
}
}
类型中的基础字段可以是您要转换的任何内容to/from,然后您可以在一处定义转换逻辑。