我正在尝试使用未知类型的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。有没有更好的方法来做到这一点
答案 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; }
}
}
}