gpt4 book ai didi

c# - 更新具有相同属性的不同对象

转载 作者:行者123 更新时间:2023-11-30 23:08:57 25 4
gpt4 key购买 nike

在我的代码中,我有三个(或更多...)不同的对象,它们都具有相同的属性(例如 TrackingItemType、ReaderID 等)

它们派生自 CounterBase(它没有所需的属性,但有其他属性)。

现在我想遍历这些对象的集合。在 Collection 中,这三个对象都可以出现。因此,目前我已经为每个对象分别实现了“更新”。

Question: How can I avoid that duplicate Code written? Is there any pattern available to update the different objects with same properties?!

谢谢!

感兴趣的方法:

    private void UpdateTrackingCounters(Reading readingData, TrackingItemType trackingItemType, string trackingCounterType)
{
try
{
foreach (CounterBase counter in this.TrackingCounters)
{
if (typeof(TrackingSimpleCounter).IsInstanceOfType(counter))
{
TrackingSimpleCounter trackingCounter = (TrackingSimpleCounter)counter;

if (trackingCounter.TrackingCounterType == trackingCounterType)
{
if ((trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
)
{
trackingCounter.IncreaseOne();
}
}
}
else if (typeof(TrackingIntervalBasedRollingCounter).IsInstanceOfType(counter))
{
TrackingIntervalBasedRollingCounter trackingCounter = (TrackingIntervalBasedRollingCounter)counter;

if (trackingCounter.TrackingCounterType == trackingCounterType)
{
if ((trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
)
{
trackingCounter.IncreaseOne();
}
}
}
else if (typeof(TrackingTriggerBasedRollingCounter).IsInstanceOfType(counter))
{
TrackingTriggerBasedRollingCounter trackingCounter = (TrackingTriggerBasedRollingCounter)counter;

if (trackingCounter.TrackingCounterType == trackingCounterType)
{
if ((trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == 0
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == null)
|| (trackingCounter.ReaderID == readingData.ReaderId
&& trackingCounter.TrackingItemType == trackingCounter.TrackingItemType)
)
{
trackingCounter.IncreaseOne();
}
}
}
}
}
catch (Exception ex)
{
this.Trace.Error(ex);
}
}

最佳答案

定义一个包含你需要的属性和方法的接口(interface):

interface ITrackable
{
int ReaderID;
string TrackingItemType;
void IncreaseOne();
}

并将其添加到包含它们的每个类的声明中:

class TrackingSimpleCounter : CounterBase, ITrackable

class TrackingIntervalBasedRollingCounter: CounterBase, ITrackable

class TrackingTriggerBasedRollingCounter : CounterBase, ITrackable

如果所有类真正共享这些属性,您将不必实现任何接口(interface),因为它已经存在。

那你只需要

foreach (ITrackable counter in this.TrackingCounters)
{
if ((counter.ReaderID == 0 && counter.TrackingItemType == null)
|| (counter.ReaderID == 0 && counter.TrackingItemType == counter.TrackingItemType)
|| (counter.ReaderID == readingData.ReaderId && counter.TrackingItemType == null)
|| (counter.ReaderID == readingData.ReaderId && counter.TrackingItemType == counter.TrackingItemType)
)
{
counter.IncreaseOne();
}
}

尽管除非我误解了你的逻辑,否则你真正需要的是:

foreach (ITrackable counter in this.TrackingCounters)
{
if (counter.ReaderID == 0 || counter.ReaderID == readingData.ReaderID)
{
counter.IncreaseOne();
}
}

或者,如果您想使用 LINQ:

foreach (var counter in this.TrackingCounters.OfType<ITrackable>().Where(c => c.ReaderID == 0 || c.ReaderID = readingData.ReaderID))
{
counter.IncreaseOne();
}

关于c# - 更新具有相同属性的不同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46170774/

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