簡體   English   中英

可以創建一個沒有反射類型的新實例嗎?

[英]Possible to create a new instance of a type without reflection?

我有一個函數,目前需要一個Type變量。 該函數將其粘貼在列表中,最終需要時將創建該類型的類。

現在我用

object o=MyType.GetConstructors()[0].Invoke(new object[0]);

這很hacky,由於反射(我認為),在中等信任度下也不起作用。 有沒有更好的方法可以做到這一點而無需反思?

這種類型被定義為函數的一部分。 我需要“懶惰地”創建類,因為如果不需要,則可能無法在應用程序中創建它。 我用它例如

AddToList(typeof(Whatever)); 

注意,我願意接受有關更改函數調用的建議。 我只需要延遲創建對象並將其存儲在列表中(或者創建類型的對象)。

我考慮過lambda,但不確定它們是否可以在這里工作。

使用泛型:

public void Method<T>() where T : class, new()
{
  //code
  T t = new T();
}

使用Activator (靜止反射,嗯):

object t = Activator.CreateInstance(yourTypeVariable);

就個人而言,我會首選第一個解決方案,因為它是強類型的。 但是,您應該注意,這兩種方法僅允許使用無參數構造函數。 如果需要傳遞參數,則需要反射樹或表達式樹。

另一種替代解決方案是FormatterServices

object instance = FormatterServices.GetUninitializedObject(typeof(MyClass));

請注意,即使您沒有創建任何未初始化任何字段/屬性的實例,

class MyClass
{
   public int i = 99;
   public Object o = new object();
}

instance.i將為0, instance.o將為null。 提供純的非反射解決方案非常困難(因為總是需要調用o.GetType() )。 該解決方案實質上是對對象進行序列化,然后將其反序列化為對象,因此您無需使用反射來調用其構造函數。 但是在進行序列化/反序列化時仍然存在反思。

經過對lambda的進一步研究,我發現它們將為我提供更優雅的解決方案,並且不使用反射

所以我在列表定義中使用了

public delegate MyBaseType TypeCreator();

...
public TypeCreator Creator;

在我的函數調用中,一個簡單而優雅的lambda:

AddToList(()=>{return new MyType();});

我認為這比我的反射方法要干凈得多,因為它允許將參數放入構造函數中,還有其他一些超出此問題范圍的原因。 (這與我的項目配合得很好)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM