2012-03-08 63 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”时,您现在处于元数据和反射的状态。一旦你开始了那条黑暗的道路,它将永远支配你的命运。 – 2012-03-08 22:46:42

+0

你有什么异常? 'as'应该返回null而不是通过例外。 – Jetti 2012-03-08 22:48:14

+0

@Jetti,这里的错误将是*编译时间*。这不会运行,更不用说返回null。 – 2012-03-08 22:48:47

回答

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 2012-03-08 23:02:54

+0

好的通话,我没有真正阅读OP的代码。我会做一个编辑。 – wsanville 2012-03-08 23:03:30

+0

@zmbq:try块中有更多的'as'。 – 2012-03-08 23:04:40

1

我不知道我明白。首先,使用as不会引发异常,它只是返回null。第二,我很确定你不想投射,你只是想检查类型,所以你需要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); 

注:我假设_Dataobject型的,否则,你只需要使用as运营商与_Data的类型。

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