我需要找到一種方法來制作型別為 的物件的副本Type。我有一些代碼可以復制 object 并且很多這些物件具有 type 的屬性Type。我不能簡單地做一個相等,否則參考將是相同的,并且這些副本中的幾個物件將修改這些屬性,但它不能更新其他屬性,因此它必須是一個新值。
所以這是一個非常基本的示例類和行為
public class A
{
public int Quantity { get; set; } = 0;
public Type ConnectionType { get; set; } = null;
public A Copy()
{
var copy = new A();
copy.Quantity = Quantity;
copy.ConnectionType = ???
}
}
我的想法很簡單,我告訴自己“嘿,讓我們快速破解它并實體化該型別的物件并獲取它的 GetType()”
所以我試過這個:
public A Copy()
{
var copy = new A();
copy.Quantity = Quantity;
var copyType = Activator.CreateInstance(ConnectionType).GetType();
copy.ConnectionType = copyType;
}
不要誤會我的意思,這適用于極少數課程。問題是在該屬性中傳遞的不同型別并非都具有默認建構式。該課程也并非全部在內部開發,每周更換一次或兩次。
有什么方法可以在Type不依靠Activator.CreateInstance.
顯然,這是一個非常小的樣本。在現實中,我有一個型別的許多特性Type在數千物件和真實的代碼實際上是使用了很多反思和這個特殊的財產執行這樣的代碼,如果PropertyInfo.PropertyType是Type。
uj5u.com熱心網友回復:
Type每個班級總是只有一個,因此您可以安全地分配它。
摘自 Object.GetType:
對于具有相同運行時型別的兩個物件 x 和 y, Object.ReferenceEquals(x.GetType(),y.GetType()) 回傳 true。
因此,Type對于任何給定的類,不可能存在兩個實體,總是只有一個(ReferenceEquals 不能被覆寫)
在你的情況下,你可以這樣做:
copy.ConnectionType = ConnectionType;
完整示例:
public class A
{
public int Quantity { get; set; } = 0;
public Type ConnectionType { get; set; } = null;
public A Copy()
{
var copy = new A();
copy.Quantity = Quantity;
copy.ConnectionType = ConnectionType;
return copy;
}
}
uj5u.com熱心網友回復:
Type物件是不可變的。您可以將不可變型別(如string)視為值型別。因此,沒有必要進行克隆。
此外,您不能自己創建和初始化Type物件,也不能克隆它們。
uj5u.com熱心網友回復:
Activator.CreateInstance(ConnectionType).GetType()應該回傳Type. 從檔案:
對于兩個物件
x,并y具有相同型別的運行,Object.ReferenceEquals(x.GetType(),y.GetType())回傳true。
所以沒有必要使用Activator.CreateInstance方法 - 簡單的淺復制將具有相同的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341578.html
標籤:C#
上一篇:多次按鍵旋轉會導致不需要的角度
