如何使用未知类型的AS关键字

时间:2012-03-08 22:44:23

标签: c# c#-3.0

我正在尝试使用未知类型的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 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分: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类型。

答案 2 :(得分: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; }
        }
    }
}