gpt4 book ai didi

c# - 我可以制作一个模板,或者在 C# 中生成一堆几乎相同的属性吗?

转载 作者:行者123 更新时间:2023-11-30 14:44:53 25 4
gpt4 key购买 nike

我正在编写一个 C# 类来驱动一个串行硬件设备,它有一堆双重设置。底层驱动程序库有一堆用于 double 值的 setter 和 getter 函数,我想将它们包装在属性中并进行一些错误处理。我可以使用某种模板生成这些属性吗?

所以我想以这样的方式结束:

public double Acceleration
{
get
{
int errorCode = _device.AC_Get(out double value, out string errorString);
if (errorCode != 0)
throw new Exception(errorString);
return value;
}
set
{
int errorCode = _device.AC_Set(value, out string errorString);
if (errorCode != 0)
throw new Exception(errorString);
}
}

然后制作一个模板,这样我就可以像这样定义一堆属性:

public double Acceleration : DoublePropertyTemplate(_device.AC_Set, _device.AC_Get)
public double Velocity : DoublePropertyTemplate(_device.VEL_Set, _device.VEL_Get)
public double Position : DoublePropertyTemplate(_device.POS_Set, _device.POS_Get)

显然,我可以将完整的属性定义写一百万次,但这将具有教育意义,而且学习如何生成它们可能更有效。

最佳答案

很高兴您提到“一种更 C# 的方式来做到这一点”。虽然创建一个模板来生成代码可能很有用且非常高效,但这个示例似乎不是文字模板方法的一个糟糕用例;原因如下:

  1. 它在您的代码库中自动重复。如果您有 n 个这些属性,大部分代码只会重复 n 次。在您不知不觉中,您的代码已经湿透了。
  2. 从模板生成的代码需要在所有使用点手动更新。不幸的是,您无法自动重构使用该模板的所有代码;你能记住它用过的所有地方吗??
  3. 它忽略了基本的 OOD/P 概念。

对我来说,“一种更 C# 的方式来做到这一点”意味着代码。我认为您可以使用代码来实现这一点,尽管由于使用了 delegate,它可能看起来有点间接和笨拙。尽管如此,我认为它仍然优于模板方法,所以在这里......

对于所有这些双重属性,您的代码完全相同,这使得它的大部分错误处理样板。为了解决这个问题,我们需要一种方法来抽象在设备上调用的实际方法;输入代表。

下面,我有一个类将两个与设备中的方法匹配的委托(delegate)作为其构造函数参数。然后,我公开了一个 double Value 属性,该属性用于使样板文件对所有属性都通用。要使用它,您只需将相应的设备方法传递给 DoubleProp 就可以了。请注意,此代码将由所有 DoubleProp 使用;模板这个类的定义。

class DoubleProp
{
public delegate int Getter(out double value, out string errorString);
public delegate int Setter(double value, out string errorString);

private Getter _getter;
private Setter _setter;

public double Value
{
get
{
CheckErrorCode(
_getter(out double value, out string errorString),
errorString
);
return value;
}

set
{
CheckErrorCode(
_setter(value, out string errorString),
errorString
);
}
}

public DoubleProp(Getter getter, Setter setter)
{
_getter = getter;
_setter = setter;
}

private void CheckErrorCode(int errorCode, string errorString)
{
if (errorCode != 0)
{
throw new Exception(errorString);
}
}

// Make getting the value a little prettier...
public static implicit operator double(DoubleProp dp) => dp.Value;
}
/* Usage:
// Given this Acceleration property...
public DoubleProp Acceleration { get; set; }

// You could construct it like so provided
// _device is available...
Acceleration = new DoubleProp(_device.AC_Get, _device.AC_Set);
*/

关于c# - 我可以制作一个模板,或者在 C# 中生成一堆几乎相同的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com