2012-03-08 4 views
1

不明なタイプのASキーワードを使用しようとしています。ここに私のコードは次のとおりです。不明なタイプのASキーワードの使用方法

public GetData(Type MyType, string CSVPath) 
{ 
    var engine = new FileHelperEngine(MyType); 

    try 
    { 
     _Data = engine.ReadFile(CSVPath) as MyType; //error here 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine("Error occured: " + ex.Message); 
    } 
} 

あなたは、私はエラーを取得しています。このコードで見ることができるようがMyTypeですました。これを行う良い方法はありますか?

+2

あなたは基本的に 'as'を使用できません。 'Type MyType'を扱うとき、あなたは今メタデータとリフレクションの土地にいます。 *その暗い道を始めると、永遠にあなたの運命を支配します。 –

+0

例外はありますか? 'as 'はnullを返し、例外を介して返されません。 – Jetti

+0

@ジェッティ、ここでのエラーは*コンパイル時*です。これは実行されず、nullを返すことはできません。 –

答えて

3

ではなく、パラメータとしてTypeに渡すのジェネリックメソッドを使用します。私はこのような動的キャストのための良い例苦労の思考を持っているものの

public void GetData<T>(string CSVPath) 
{ 
    var engine = new FileHelperEngine(typeof(T)); 
    _Data = engine.ReadFile(CSVPath) as T; 
    if (_Data != null) 
    { 
     //correct type, do the rest of your stuff here 
    } 
} 
+0

そのため、クラスはジェネリックである必要があります(したがって、_DataはT型です)。 _Dataが既にT型の場合、GetDataは汎用である必要はありません。 – zmbq

+0

よろしくお願いします。実際にOPのコードを読まずにOPコードを取得しました。私は編集を行います。 – wsanville

+0

@zmbq:tryブロックに 'as'以上の値があります。 –

1

わかりません。まず、asを使用しても例外はスローされず、nullが返されます。

第2に、キャストしたくないと確信しています。タイプを確認したいので、isオペレータが必要です。しかし、MyTypeは実行時にしか認識されていないため、実際にはリフレクションが必要です。それは非常に簡単です:

object o = engine.Readfile(CSVPath); 
if(MyType.IsAssignableFrom(o.GetType()) 
    _Data = o; 
else 
    Console.WriteLine("Mismatching types: {0} is not of type {1}", o.GetType(), MyType); 

注:私は、_Dataはタイプobjectであると仮定していそうでない場合は、あなただけの_Dataのタイプとas演算子を使用します。

0

はここで、これを行うクラスです。 :

using System; 

namespace Test 
{ 
    class Program 
    { 
     private object _data; 

     static void Main(string[] args) 
     { 
      new Program().EntryPoint(); 
     } 

     public void EntryPoint() 
     { 
      GetData(typeof(string), "Test"); 
      Console.WriteLine(_data); 
     } 

     public void GetData(Type myType, string csvPath) 
     { 
      var engine = new FileHelperEngine(myType, csvPath); 

      // This is the line that does it. 
      _data = Convert.ChangeType(engine.ReadFile(csvPath), myType); 
     } 

     private class FileHelperEngine 
     { 
      public string Value { get; set; } 
      public FileHelperEngine(Type t, string value) { Value = value.ToString(); } 

      public string ReadFile(string path) { return Value; } 
     } 
    } 
} 
関連する問題