2017-08-15 4 views
-2

編集
どちらの質問も私の回答ではありません。おそらく、この質問に近づくためのより良い方法:
どのように型としてキャスト変数を使用しますか?
OR Type変数を宣言するために、型に文字列キャストを使用する方法を教えてください。キャストされた変数をどのようにタイプとして使用しますか?

例は、以下を参照してください
Document document = ((document)modelObject);

を文書の種類は、ここで使用されるが、私は私のmodelObjectは、私はそれを得るだろうか、ドキュメント知りませんでしたと言っていますか?

トンは、上記の私の例ではドキュメント

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

ある場合、それは動作しない架空の想像ソリューション「『T』は可変であるが、タイプのように使用される」ので

ORIGINAL
私はさまざまな型を動的に表示するように扱うために使用したいコントロール構造を持っています。これらのタイプは、タイプの名前で収集され、そのようなタイプに基づいて制御構造を入力します。私がしたいことは、フォルダーの機能を扱うことができるように(フォルダーの拡張を許可するなど)、フォルダーのコントロール構造を維持することですが、すべてのタイプを一般化して構造体を何度も繰り返しコピーするのではなく、処理する型をわずかに変更して単一の構造体を作成します。

だから、私の構造は(おおよそ)のようになります。STLとドキュメントタイプは、彼らは次のように扱われているものの種類変更の若干の変化にまったく同じ処理する方法

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); 
} 

は注意してください。 理想的には、それは次のようになります。

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()ですすべてのオブジェクトに共通です。あなたが唯一のオブジェクトのサブセットを処理する必要があるが、彼らは共通のインターフェースを持っていないが、彼らは共通の性質を持っている場合(例えばstring Object_string)を、あなたが使用することができ

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

:ソリューションは非常に短く、反射のビット。これは最後の手段です。

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

もちろん、あなたが誤ってオブジェクトの間違った種類を提供し、それがObject_string性質を持っていない場合にはnullチェックが必要になります。

+0

私の例では何もインスタンス化されていません。これはキャストと呼ばれ、あなたの例の文字列の比較よりも安価です。しかし、それらを一様に処理したい場合(推奨)、私の2番目の例を参照してください。 –

+0

2番目の例では、無数の異なるオプションにIExplorableインターフェイスを追加する必要があります。 – jtth

+0

問題ですか?とにかく、ここでどんな種類の物体を話していますか?あなたが書いたクラスはありますか? –

0

オーバーロードするとType.GetTypeを使用できますが、名前があいまいになる可能性があるため、名前ではなくFullNameを使用してください。

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

もちろん、これだけであなたのクラス型ではなく実際のインスタンスを提供します。

0

文字列を型に変換して型として使用できませんでした。私の研究から、これは不可能です。重複したマーキングは結果ももたらさなかった。代わりに、私が今実装できる唯一の回避策は、TC型を事前にノード型として直接処理型に追加することでした。

関連する問題