【问题标题】:change propertyname base on variable [duplicate]根据变量更改属性名称[重复]
【发布时间】:2020-10-27 07:33:10
【问题描述】:

我有一个我可以自己解决的 QoL 问题。请参阅下面的代码和一些解释

public void UpdateStock(long? instID, float? Value, int counter,string KpiName)
    {
        {
            List<KpiReturn> updateKpi = new List<KpiReturn>();
            updateKpi.Add(new KpiReturn { instID = instID, KpiName = Value });
        }
     }

我的属性看起来像这样的一个类:

public partial class KpiReturn
{
    public long? instID { get; set; }
    public double? peValue { get; set; }
    public double? psValue { get; set; }
    public double? pbValue { get; set; }

}

此代码不起作用,因为我的 kpiReturn 剂量具有“KpiName”的定义 现在,我根据是否需要 peValue、psValue、pbValue 运行 3 个不同的 if 语句。但我想为此添加更多属性。

在附加的 void UpdateStock 代码中,我已将字符串“psValue”传递给 KpiName。

有什么方法可以让程序理解代码中的内容

updateKpi.Add(new KpiReturn { instID = instID, KpiName = Value }

我想传递 kpiName 值而不是实际名称“kpiName”?即 psValue,pbValue 或 peValue

【问题讨论】:

  • 这根本不是你能做的。您可能得到的最接近的是在内部进行切换的索引器,可能在枚举上
  • 为什么不能直接找到合适的KpiReturn并修改其属性?例如GetKpi(12345).psValue = 3.14159
  • 听起来有点像您的方法可能正在做许多不同的事情,并且您正在使用 if 语句来有效地运行单独的操作。如果是这种情况,您会更喜欢做一件事的更简单的方法。
  • 好吧,你可以尝试使用 dynamic 对象 stackoverflow.com/questions/12709333/… 但是你当然会失去编译时类型检查。
  • 对@MarcGravell 的切换想法的一个转折:在KpiReturn 内创建一个private Dictionary&lt;string, double?&gt; 来保存所有值,然后使用它们的Dictionary 将所有peValue, psValue 属性包装起来字符串名称作为键。然后为KpiReturn 创建一个构造函数,它接受你的字符串键和double? 值,并将它们添加到Dictionary

标签: c#


【解决方案1】:

有时,如果您继续将问题分解成更小的部分,这样的问题会变得更容易。正确级别的正确抽象可能会有所帮助,这是@N-ate 在提到将问题分解为更小的操作时所建议的关键。

例如,到目前为止,您似乎认为探针需要一个包含所有内容的大型结果对象。有点像这个大泥球风格的物体:

class KpiBigBallOfMudReturn
{
    public long? instId { get; set; }
    public double? peValue { get; set; }
    public double? psValue { get; set; }
    public double? pbValue { get; set; }

    // lets keep adding many more properties to
    // this class, make them nullable so we don't
    // always have to set all of them....
    // .. and more.. ...
}

但是您还描述的是,您正在为该返回单独创建值,并且这些东西是独立的并且也有一个名称。因此,如果您围绕它们创建一个抽象,它可能看起来像这样:

class KpiValue
{
    public string KpiId { get; set; }
    public double Value { get; set; }
}

这里的 KpiId 是您在 Update 方法中的“KpiName”。

@MarcGravell 评论建议使用开关根据名称选择正确的值。现在我们有了名称/值对,我们可以使用字典来做类似的事情——正如@SeanSkelly 建议的那样。我们可以用这样的东西替换大泥球结果对象:

class KpiResult
{
    readonly IDictionary<string, double> kpiValues;

    public KpiResult(long instId, IEnumerable<KpiValue> values)
    {
        this.kpiValues = values.ToDictionary(k => k.KpiId, v => v.Value);
    }

    public double? this[string key]
    {
        get
        {
            if (this.kpiValues.TryGetValue(key, out var value))
                return value;

            return null;
        }
    }
}

同样,这只是一个示例,说明当您遇到此类技术问题时,看看您是否可以通过使您的设计更加完善来解决这些问题通常很有帮助SOLID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2023-03-08
    • 2016-12-27
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多