2012-10-01 62 views
3

我有一個作爲ISomething傳遞給我的對象。 我需要序列化,不過對象我serilizer預計具體類型即類型參數:如何使用變量作爲類型?

string xml = Utilities.Serialize<ConcreteType>(myObject); 

基本上我想以同樣的事情,因爲這傢伙:Creating a generic object based on a Type variable

但是我不希望創建一個對象的新實例,我想使用生成的類型作爲我的泛型類的參數。

所以我概括地說問題是如何創建一些變量,代表具體類型的一些對象,我可以用一個通用類這樣使用的:

string xml = Utilities.Serialize<ConcreteType>(myObject); 

其中ConcreteType是什麼,我需要創建。

+0

。淨。你可能會評論全名(所有命名空間)嗎? – CrazyCasta

+0

@CrazyCasta:它並不重要。 OP需要的是'Utilities.SomeMethod (myObject)' –

+0

這與我只是用它作爲例子無關。爲了澄清,我可能想列出一個名單其中T是我的問題的具體類型。 – Sam

回答

-2

可能是另一種通用方法的情況。如果你擁有Utilities.Serialize(...),並能生成新的過載,看看:

http://msdn.microsoft.com/en-US/library/twcad0zb(v=VS.80).aspx

例如:

string Utilities.Serialize<T>(T object) 
    where T : ConcreteType 

在進一步的思考(雙關語意)可能以下是你在找什麼?

Calling a generic method with a dynamic type

+0

該方法已經是通用的,問題是如何在這種情況下調用它。 – svick

+0

嗯? OP的問題已經描述了一種通用的方法。 –

+0

哇,苛刻。 我的思路是: Utilities.Serialize (myObject); 這樣做: Utilities.Serialize (T對象) 其中T:ConcreteType 的問題雖然不是太具體,所以我沒有太具體的我的回答,但。我希望用戶會回來一個更具體的問題。 – Jace

0

如果你確實需要讓你可以使用的GetType實際對象的類型()。問題是,你將不得不使用反射來調用你所有的函數,因爲據我所知,沒有簡單的方法用類型的變量調用它們。

0

你不能保證所有的ISomething都是ConcreteType的,但是你可以施放它們並傳遞那些工作的東西。

string CastAndSerialize(ISomething somthing) 
{ 
    //castSomthing will be null if ISomthing was not a ConcreteType.  
    ConcreteType castSomthing = somthing as ConcreteType; 

    if(castSomthing != null) 
    { 
     return Utilities.Serialize<ConcreteType>(castSomthing); 
    } 
    else 
    { 
     return null; //Or whatever you want to use to represent that the cast failed. 
    } 
} 

這是一個更通用的版本,這將與任何是class

string CastAndSerialize<T>(ISomething somthing) where T : class 
{ 
    T castSomthing = somthing as T; 

    if(castSomthing != null) 
    { 
     return Utilities.Serialize<T>(castSomthing); 
    } 
    else 
    { 
     return null; 
    } 
} 
+0

這兩個示例都不滿足OP在運行時指定具體類型*的需要。 –

2

所以我們可以說你已經得到的東西,如:

public static class Util 
{ 
    public static T Foo<T>(object obj) 
    { 
     // Do actual stuff here 
     return default(T); 
    } 
} 

通常,編譯器將線了該方法的任何使用,基於你通過它相關的類屬變種交換。我們不再能依靠編譯器,如果你有一個包含變量的類型- 但我們可以問全班同學給我們我們想要的變種:我不熟悉Utilities.Serialize在

public void DoFooWith(object blob) 
{ 
    // Get the containing class 
    var utilType = typeof(Util); 
    // Get the method we want to invoke 
    var baseMethod = utilType.GetMethod("Foo", new Type[]{typeof(object)}); 
    // Get a "type-specific" variant 
    var typedForBlob = baseMethod.MakeGenericMethod(blob.GetType()); 
    // And invoke it 
    var res = typedForBlob.Invoke(null, new[]{blob}); 
}