我不知道标题是否清晰,但基本上我试图实现这样的事情:
public class Effect
{
public int InternalId ...
public void ResetName() ...
}
当调用ResetName时,这会将对象的名称重置为:
"Effect " + someIndex;
因此,如果我有5个Effect
个实例,它们将被重命名为:
"Effect 1"
"Effect 2"
"Effect 3"
...
所以我在另一个管理器/容器类型中有另一个方法(ResetNames
),为每个实例调用ResetName
。现在我必须将一个整数传递给ResetName
,同时将一个计数器保留在ResetNames
内。但这感觉并不干净,这使我无法在经理类之外调用ResetName
,这是有效的。
如何更好/更干净?
至于InternalId
,它只是一些存储所有内容创建顺序的id。所以我不能仅仅依靠这些,因为数字很大,比如32000等等。
编辑:Container ResetNames代码:
int count = 1;
var effects = this.Effects.OrderBy ( n => n.InternalId );
foreach ( Effect effect in effects )
{
effect.ResetName ( count );
++count;
}
答案 0 :(得分:2)
有一个处理命名的管理器类。它还将处理子类的创建,并将嵌入对自身的引用。你现在可以在子类上调用ResetName()
,它将让它的管理器处理任何需要完成的逻辑。
我不确定您希望结果在各种情况下到底是什么,但希望以下内容会有所帮助:
public class Effect {
{
private EffectManager _manager;
public string Name {get;set;}
public Effect(EffectManager manager) {
_manager = manager;
}
public void ResetName() {
Name = _manager.GetNextName();
}
}
public class EffectManager {
private List<Effect> Effects;
private int currentIndex;
public Effect CreateEffect() {
var e = new Effect(this);
Effects.Add(e);
}
public string GetNextName() {
return "Effect " + currentIndex++;
}
public void ResetAllNames() {
currentIndex = 0;
foreach(var effect in Effects) {
effect.Name = GetNextName();
}
}
}
答案 1 :(得分:0)
许多可能性之一:为您的Effect类提供公共属性Name,并在填充Effect对象的列表或数组的方法中,指定名称。您还可以为Effect类提供一个整数属性并设置数字,以便您可以根据需要对它们进行排序。
public class Effect()
{
public string Name() { get; set; }
}
public class SomeClass()
{
private List<Effect> Effects;
public static void WhateverMethod()
{
for (var i = 0; i < Effects.Count; i++)
Effects[i].Name = "Effect " + (i + 1).ToString();
}
}
答案 2 :(得分:0)
不是让Name成为存储属性,你可以这样做吗?
public class Effect
{
public int InternalId ...
public int Index;
public string BaseName;
public string Name
{
get
{
return BaseName + index;
}
}
}
答案 3 :(得分:0)
名称是特定于所有实例还是特定集合中的所有实例?
如果是前者你可以做类似的事情:
public class Effect
{
private static int _lastId;
public Effect()
{
InternalId = _lastId++;
}
public string Name
{
get { return "Effect" + InternalId.ToString(); }
}
public int InternalId ...
}
答案 4 :(得分:0)
Namespace Diagnostics
<Conditional("DEBUG")> _
Public NotInheritable Class UniqueID
Private Shared _idBase As Integer
Private Sub New()
'keep compiler from creating default constructor
End Sub
Public Shared Function GetNext() As String
Return "ID" + System.Threading.Interlocked.Increment(_idBase).ToString("00")
End Function
End Class
End Namespace