Как использовать ключевое слово AS с неизвестным типом - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь использовать ключевое слово 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. Есть ли лучший способ сделать это

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Используйте универсальный метод вместо передачи 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
    }
}
1 голос
/ 09 марта 2012

Я не уверен, что понимаю.Во-первых, использование as не выдает исключение, оно просто возвращает ноль.

Во-вторых, я уверен, что вы не хотите разыгрывать, вы просто хотите проверить тип, поэтому вам нужнооператор 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.

0 голосов
/ 09 марта 2012

Вот класс, который делает это, хотя мне трудно думать о хорошем случае для такого динамического приведения.

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; }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...