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

本文关键字:AS 关键字 类型 何使用 未知 | 更新日期: 2023-09-27 18:27:08

我正在尝试使用未知类型的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是,我会得到一个错误。有没有更好的方法来完成

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

使用通用方法,而不是传入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
    }
}

我不确定自己是否理解。首先,使用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的类型一起使用。

这里有一个这样做的类,尽管我很难为这样的动态演员阵容想出一个好的例子。:

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