我需要在建構式中確定類 T 的成員 T 是否是靜態成員。我希望這將涉及檢查“this”的某些屬性,但我無法確定要查找的內容。
public class Thing
{
public static readonly List<Thing> ListOfStaticThings = new();
public static readonly Thing StaticThing1 = new ("StaticThing1");
public static readonly Thing StaticThing2 = new ("StaticThing2");
public static readonly Thing StaticThing3 = new ("StaticThing3");
public Thing NonStaticThing = new("NonStaticThing");
public string Name { get; set; }
private Thing(string name)
{
Name = name;
if(this.IsStatic) //how to determine if the thing being constructed is static?
{ ListOfStaticThings.Add(this);}
}
}
如何確定該Static屬性是否應用于this?
*** 更新 ***
在此示例中,StaticThing 和 NonStaticThing 都將使用私有建構式進行構造。但是,只有 StaticThing 應在構造時添加到 ListOfStaticThings。完整的實作將有 20 多個型別別的靜態只讀欄位。
我已經驗證 ListOfStaticThings 將包含 StaticThing。
ListOfStaticThings 有多種用途。這是通往Enumeration Classes的路徑,此串列包含該類允許的所有可能事物(例如帳戶狀態)。此外,可以將 ListOfStaticThings 傳遞給 EFCore.HasData 以播種表中的資料。它還可以用于單元測驗中的資料驗證,因為它包含所有資料并保留在模型中。
但是,所有這些用例都超出了這個問題的范圍。我正在尋找的部分是如何確定正在構造的“this”是否是靜態的,以便我可以將其添加到 ListOfStaticThings。我希望 StaticThing1、2 和 3 在串列中,但不是 NonStaticThing。
*** 最終更新 *** 正如 McAden 的回答所指出的,這不是必需的,因為 T 的非靜態成員無法添加到類 T 中而不會導致無限遞回溢位。由于只能添加 T 的靜態成員,因此無需在建構式中確定它們是否也是靜態的。
uj5u.com熱心網友回復:
我認為你的做法是錯誤的——所有靜態成員都應該在屬性本身或靜態建構式中初始化,所以我會這樣做:
public class Thing
{
public static readonly List<Thing> ListOfStaticThings;
public static readonly Thing StaticThing1 = new Thing("StaticThing1");
public static readonly Thing StaticThing2 = new Thing("StaticThing2");
public static readonly Thing StaticThing3 = new Thing("StaticThing3");
// public Thing NonStaticThing = new("NonStaticThing");
public string Name { get; set; }
private Thing(string name)
{
Name = name;
}
static Thing()
{
ListOfStaticThings = new List<Thing> {
StaticThing1,
StaticThing2,
StaticThing3
};
}
}
現在實體建構式不需要知道它是否是“靜態”實體。
但是,為了安全起見(意味著不依賴于初始化程式的順序),我還將在靜態建構式中創建靜態實體:
public class Thing
{
public static readonly List<Thing> ListOfStaticThings;
public static readonly Thing StaticThing1;
public static readonly Thing StaticThing2;
public static readonly Thing StaticThing3;
public string Name { get; set; }
private Thing(string name)
{
Name = name;
}
static Thing()
{
ListOfStaticThings = new List<Thing> {
StaticThing1 = new Thing("StaticThing1"),
StaticThing2 = new Thing("StaticThing2"),
StaticThing3 = new Thing("StaticThing3")
};
}
}
現在,如果您出于其他原因需要知道它是否是“靜態的” ,那么我將創建另一個采用靜態標志的私有建構式:
private Thing(string name, bool isStatic=False) : this(name)
{
if (isStatic) {
// Do different stuff for a "static" instance
}
}
但我不會將邏輯“添加”到靜態串列中——這可以通過另一種方式更清晰地完成。
[我]如何防止將非靜態成員添加到串列中
如果要使串列不可變,則可以將其公開為不可變型別或介面,例如“IEnumerable”,或者您可以使用靜態屬性 getter 動態生成串列:
public static IEnumerable<Thing> ListOfStaticThings {
get {
return new List<Thing> {
StaticThing1,
StaticThing2,
StaticThing3
};
}
}
uj5u.com熱心網友回復:
更新答案:
在 OP 非常具體的首選方法中,沒有任何意義。這public Thing NonStaticThing = new("NonStaticThing");將導致StackOverflowException每個孩子將嘗試無限地創建另一個孩子。
但是,總的來說,我對任何嘗試“靜態”做某事或“不”做某事的人的建議是對靜態事物使用靜態建構式。
基于未編輯問題的原始答案:
操作順序 - 靜態欄位將在該類之外的任何其他內容可以呼叫該類的建構式之前分配,并且用于設定該靜態只讀欄位的建構式將在實際分配靜態欄位之前被呼叫。只需檢查建構式中的靜態欄位是否為空。
private static void Main(string[] args)
{
var test = new Thing();
Console.WriteLine(test.IsStaticInstance); // False
Console.WriteLine(Thing.Instance.IsStaticInstance); // True
}
public class Thing
{
public static readonly Thing Instance = new Thing();
public Thing()
{
IsStaticInstance = Instance == null;
}
public bool IsStaticInstance { get; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491885.html
