我有以下類:`Activator.CreateInstance`和派生類型`new`屬性
public class HeaderBase
{
public int HeaderSize { get { return sizeof(byte); } }
public byte[] Content { get; private set; }
public HeaderBase(byte[] bytes)
{
Content = bytes;
}
}
public class BiggerHeader : HeaderBase
{
public new int HeaderSize { get { return sizeof(byte) + sizeof(UInt32); } }
public BiggerHeader(HeaderBase header) : base(header.Content)
{ }
}
我也有一個模板的方法來編組和實例化BiggerHeader
類型
public static T Get<T>() where T : HeaderBase
{
HeaderBase b = new HeaderBase(new byte[]{});
T instance = (T)Activator.CreateInstance(typeof(T), b);
return instance;
}
根據到MSDN:
where T : <base class name>
:type參數必須是或者是從指定的基類派生。
但是,HeaderSize
的值是1而不是5,正如我所預料的那樣。爲什麼會出現這種情況,我如何實例化一個將使用派生類型的new
屬性的對象?
相關:Generics in C# - how can I create an instance of a variable type with an argument?
刪除'new'關鍵字,C#編譯器現在可以生成一個警告。你需要了解那個警告,現在你不需要。在這個網站上有很多關於它的好Q + A。使用'new'來抑制警告是一個錯誤。 –
@HansPassant我明白這一點。我需要基類來執行基於'HeaderSize'的邏輯,而不是繼承的大小。我的問題是'Activator'創建的實例的行爲像基類而不是派生類型,儘管這是我通過作爲參數傳遞給'CreateInstance'的參數類型 – user5877732
它與創建的實例無關激活器,一切與你的參考變量的類型有關。哪一個是HeaderBase,任何非虛擬成員都將採取非虛擬行爲。 –