2017-08-15 76 views
-2

編輯
這兩個問題都不回答我的問題。也許更好的方法來解決這個問題:
你如何使用鑄造變量作爲類型?
你如何使用一個字符串強制類型來聲明一個類型變量?你如何使用鑄造變量作爲類型?

示例,請參見:
Document document = ((document)modelObject);

的文檔類型用在這裏,但說我不知道​​我的modelObject是一個文件,我將如何獲得呢?

假設想像解決方案,其中t是文獻

Type t = Type.GetType(type.Name); 
t tVar = ((t)modelObject); 

在上述我的例子,這是行不通的,因爲「‘T’是可變的,但是,使用像類型」

ORIGINAL
我有一個控制結構,我想用它來處理動態顯示的不同類型。這些類型與類型收集。名稱然後基於這樣的輸入控制結構。我希望能夠做到的是保留文件夾的控制結構,這樣我就可以繼續處理文件夾功能(允許擴展文件夾等),但可以概括其他類型,以便它們都可以在一個單一的結構,而不是一遍又一遍地複製結構,但需要處理的類型略有改變。

所以,我看的結構(大致)是這樣的:

Type type = modelObject.GetType(); 
if (type.Name == "Folder") 
{ 
    Folder folder = ((Folder)modelObject); 
    TreeNode NewNode = new TreeNode(folder.Object_string); 

    NewNode.Tag = folder; 

    CurrentRootNode.Nodes.Add(NewNode); 
    if (fRecursive) 
    { 
     ModelObject[] objects = { modelObject }; 
     String[] attributes = { "contents" }; 

     WorkspaceObject[] NewNodeContents = ((Folder)modelObject).Contents; 

     AddContentsToNode(NewNode, NewNodeContents, true); 
    } 
    else 
    { 
     TreeNode EmptyNode = new TreeNode(""); 
     NewNode.Nodes.Add(EmptyNode); 
    } 
} 

if (type.Name == "STL") 
{ 
    STL stl = ((STL)modelObject); 
    TreeNode NewNode = new TreeNode(stl.Object_string); 

    NewNode.Tag = stl; 

    CurrentRootNode.Nodes.Add(NewNode); 
} 

if (type.Name == "Document") 
{ 
    Document document = ((Document)modelObject); 
    TreeNode NewNode = new TreeNode(document.Object_string); 

    NewNode.Tag = document; 

    CurrentRootNode.Nodes.Add(NewNode); 
} 

注意如何STL和文檔類型的處理方式正好與改變什麼類型的,他們作爲處理的輕微變化相同。 理想的情況下,它應該是這樣的:

if (type.Name == "Folder") 
{ ... } 
else 
{ 
    (Type)type.Name tn = (((Type)type.Name)modelObject); 
    TreeNode NewNode = new TreeNode(tn.Object_string); 

    NewNode.Tag = tn; 

    CurrentRootNode.Nodes.Add(NewNode); 
} 

然而,從上面可以看出,type.Name是一個字符串。
(類型)type.Name懸停文字 - Cannot convert type 'string' to 'System.Type'

所以,問題是:

是否有「通用」的方式轉換成字符串類型,或者分配基於字符串類型?

我似乎無法找到任何通用的方式來處理整個董事會的類型聲明(如理想的例子將是理想!)。

回答

0

雖然將字符串轉換爲類型並不是那麼困難,但我必須指出,你正在以這種錯誤的方式進行。你不應該在字符串中存儲一個類型,就像你永遠不會在字符串中存儲數字或者存儲日期一樣。

如果您有一系列的類型檢查,以及不同的操作每個,遵循此模式:

public void HandleModelObject(object modelObject) 
{ 
    var folder = modelObject as Folder; 
    if (folder != null) 
    { 
     TreeNode NewNode = new TreeNode(folder.Object_string); 
     return; 
    } 
    var document = modelObject as Document; 
    if (document != null) 
    { 
     TreeNode NewNode = new TreeNode(document.Object_string); 
     return; 
    } 
    var someOtherType = modelObject as SomeOtherType; 
    if (someOtherType != null) 
    { 
     TreeNode NewNode = new TreeNode(someOtherType.Object_string); 
     return; 
    } 
} 

另外,我建議你添加一個通用的接口,可顯示的所有對象在樹節點中,例如IExplorable什麼的。然後,你甚至不必投:

interface IExplorable 
{ 
    string Object_string { get; set; } 
} 

class Folder : IExplorable 
{ 
    public string Object_string { get; set; } 
} 

class Document : IExplorable 
{ 
    public string Object_string { get; set; } 
} 

public void HandleModelObject(IExplorable modelObject) 
{ 

    TreeNode NewNode = new TreeNode(modelObject.Object_string); //No if or cast required at all 
} 

如果你不想接口,並且要能夠處理任何對象,唯一的屬性,你可以使用是GetType()ToString(),這是通用於所有對象。該解決方案是很短:

public void HandleModelObject(object modelObject) 
{ 
    TreeNode NewNode = new TreeNode(modelObject.ToString()); 
} 

如果你只需要處理對象的子集,但他們沒有一個通用的接口,但他們有一個共同的特性(例如string Object_string),那麼你可以使用一點反射。這是最後的手段。

public void HandleModelObject(object modelObject) 
{ 
    var value = modelObject.GetType().GetProperty("Object_string", BindingFlags.Instance).GetValue(modelObject) as string; 
    TreeNode NewNode = new TreeNode(value); 
} 

當然,你需要null檢查的情況下,你錯誤地提供錯誤類型的對象,它並沒有一個Object_string財產。

+0

在我的任何一個例子中都沒有得到實例;它被稱爲強制轉換,並且比您的示例中的字符串比較便宜。但如果你想統一處理它們(推薦),看看我的第二個例子。 –

+0

第二個示例仍然要求將IExplorable接口添加到無數個不同的選項 – jtth

+0

這是一個問題嗎?無論如何,我們在這裏談論什麼樣的物體?你寫的這些課程是? –

0

您可以使用Type.GetType重載,但您應該使用FullName而不是Name,因爲名稱可能會導致模糊。

string type = typeof(Program).FullName; 
var typeObj = Type.GetType(type); 

當然這隻會給你類的類型而不是實際的實例。

0

我無法將我的字符串轉換爲類型,然後將它們用作類型。從我的研究來看,這是不可能的。重複標記也沒有結果。相反,我現在可以實現的唯一解決方法是事先將TC類型作爲節點直接添加處理類型。