2016-02-08 26 views
0

我使用Reflection.EmitTypeBuilder創建一個新的類型在運行時。我的設置是這樣的:我可以現場的類中運行時的類型設置爲C#中的新創建的類型?

public class MyClass { 
    public object MyField = CreateInstanceOfNewType(); 
    public MyClass() {} 
} 

問題是MyClass.MyField聲明瞭object型,所以當澆注料類型分配給MyClass.MyField存在新類型的隱式轉換操作符不叫。有沒有辦法到現場的類型設置爲新創建的類型,以便使其表現得如何,將在典型案例?

+0

該類型是否實現一個已知的接口?如果是這樣,只需將* object *分配給一個類型爲該接口的變量。 –

+0

隱式轉換操作符不能在接口定義,雖然。這確實會改變賦值類型,但不允許使用隱式強制類型轉換。 –

+0

請描述您的實際業務問題,然後,而不是這個未知問題的不可行解決方案。你是對的 - C#不允許這個解決方案工作。這並不意味着你的問題是無法解決的。 –

回答

1

這取決於確切的用例,一個可能的解決方案是讓你的類是通用的,然後使用反射來創建一個靜態的通用方法來創建一個類的實例。這使您可以聲明你的財產時所使用的變量動態類型:

public class MyClass<T> { 
public T MyField = CreateInstanceOfNewType<T≥(); 
public MyClass() {} 
} 

public static MyClass<T> createClass<T>() { 
return new MyClass<T>: 
} 

dynamic instanceOfMyClass = typeof(SomeClass).GetMethod("createClass").MakeGeneric(dynamicType).Invoke() 

另一種方法是使用動態關鍵字。

+0

當我使用'dynamic'時,它的行爲與我使用'object'時的行爲相同。當我嘗試分配另一種類型時,它只是採用新類型而不是強制隱式轉換。 –

+0

你的createinstanceofclass返回什麼類型? – user3312721

0

如果我理解正確的話,你想初始化新類型的對象與你已經建立了隱式轉換操作對於一些澆注料類型的對象。我建議,而不是隱含運營商你考慮使用構造函數:使用Reflection.Emit創建把你的澆注料類型的一個參數,並使用該參數值來初始化新類型的對象構造。你想擁有同樣的結果,因爲這一段代碼會做:

public class MyNewType 
{ 
    public MyNewType(CastableType value) 
    { 
     /* implement initialization with value */ 
    } 

    /* other stuff */ 
} 

然後可以使用Activator.CreateInstance(Type type, params object[] arguments)利用該構造方法。下面是一個例子:

var newType = GetNewType(); 
var castableObject = CreateInstanceOfCastableType(); 
this.MyField = Activator.CreateInstance(newType, castableObject); 
相關問題