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 is. Есть ли лучший способ сделать это?

+2

В принципе вы не можете использовать 'as' там. Когда вы работаете с типом MyType, вы теперь находитесь в земле метаданных и размышлений. Как только вы начнете с * темного пути, навсегда он будет доминировать над вашей судьбой. –

+0

Какое исключение вы получаете? 'as' должен возвращать значение null, а не исключение. – Jetti

+0

@Jetti, ошибка здесь будет * время компиляции *. Это не будет работать, не говоря уже о возврате 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, не прочитав его. Я сделаю редактирование. – wsanville

+0

@zmbq: В блоке try больше, чем 'as'. –

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

Примечание: Я предполагаю, что _Data имеет тип object, в противном случае, вы просто использовать as оператор с типом _Data «s.

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; } 
     } 
    } 
} 
Смежные вопросы