动态属性更改,C#

时间:2015-07-14 14:53:54

标签: c# asp.net

所以我有一个替换功能,看起来像这样:

PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("DeeperSkyBlue", "0066CC");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("DeepSkyBlue", "3366FF");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("SkyBlue", "99CCFF");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("Yellow", "FFFF00");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("DarkTurquoise", "0066CC");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("Salmom", "FF8080");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("LightBlue", "3366FF");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("LightPurple", "CC99FF");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("DarkBlue", "000080");
PowerPointEventArg.powerPointDataList[index].property = PowerPointEventArg.powerPointDataList[index].property.Replace("DarkOrange", "FF9900");

在代码中,我看到了这个"替换"执行了9次,而9的唯一不同之处是"属性"。

我想知道是否有办法动态更改属性,所以我只编写一次替换代码,但更改了9个不同的属性?

2 个答案:

答案 0 :(得分:2)

创建变量以缩短代码并复制/粘贴作业:

var eai = EventArgs.InterfaceInsideEventArg[index];
var eaz = EventArgs.InterfaceInsideEventArg[z];

eai.PropertyInsideInterface = eaz.PropertyInsideInterface.Replace("DeeperSkyBlue", "0066CC");
eai.{prop2} = eaz.{prop2}.Replace("DeeperSkyBlue", "0066CC");
//etc.

可以通过按名称获取每个属性,循环和执行分配来使用反射,但是:

  • 不会少用任何代码
  • 写作比复制/粘贴
  • 需要更长的时间
  • 你必须彻底测试
  • 调试起来会更难
  • 您失去了类型安全
  • 如果任何属性名称(或类型)发生变化,您将无法知道您的代码在运行时之前是否已损坏。

答案 1 :(得分:0)

丑陋,但你可以使用一个函数和2个委托(假设你的变量属性都是string

public void DoIt(Action<string> set, Func<string> get)
{
    set(get());
}

使用

var e = EventArgs.InterfaceInsideEventArg[index];

DoIt(s => e.PropertyInsideInterface = s, 
    () => e.PropertyInsideInterface.Replace("DeeperSkyBlue", "0066CC"));

DoIt(s => e.SomeOtherProperty = s, 
     () => e.SomeOtherProperty.Replace("DeeperSkyBlue", "0066CC"));

让我们列举与@DStanley

相同的风向标的优点/缺点
  • 它的代码略少
  • 很难立即看到发生了什么
  • 不需要太多测试,代码与原始代码基本相同
  • 比原始
  • 更难调试
  • 维护类型安全
  • 在编译时检查代码。

总的来说,略好于原版,但为了简洁,我可能会坚持使用原始副本/粘贴4次。