我正在尝试根据将从用户界面检索的字符串创建一个类的实例,然后我想访问该类实例的属性。
以下是我到目前为止的概述 -
namespace MamdaAdapter
{
public interface IExchange
{
string GetTransport();
}
}
namespace MamdaAdapter
{
public class Exchange
{
public class Arca : IExchange
{
private const string _Transport = "tportname";
public string GetTransport()
{
return _Transport;
}
}
public static IExchange DeriveExchange(string ExchangeName)
{
IExchange SelectedExchange = (IExchange)Activator.CreateInstance(Type.GetType(ExchangeName));
return SelectedExchange;
}
}
}
namespace MyUserInterface
{
public class MainForm
{
private void simpleButton1_Click(object sender, EventArgs e)
{
IExchange SelectedExchange = Exchange.DeriveExchange("Exchange.Arca");
Console.WriteLine(SelectedExchange.GetTransport());
}
}
}
更新 现在,我得到一个Exception,上面写着“Value not not null”,这对我来说意味着它无法在给定字符串的情况下创建类的实例 -
答案 0 :(得分:2)
假设UI没有公开完整的类型名称,您通常需要一个字典将显示名称与类型相关联:
Dictionary<string, Type> _associations = new Dictionary<string, Type>();
然后,您只需实例化新对象:
if(_associations.ContainsKey(someString))
{
Type selectedType = _associations[someString];
return Activator.CreateInstance(selectedType) as IExchange;
}
throw new ApplicationException("No type defined for that string yo");
如果在编译时不知道该字符串,您基本上需要检查该类型是否存在:
var type = Type.GetType(someString);
if(type != null)
{
// Do Stuff
}
答案 1 :(得分:2)
此处的问题是您如何指定班级名称:
首先,指定命名空间。其次,由于Arca是一个内部类,你必须使用'+'而不是'。'
(...) = Exchange.DeriveExchange("MamdaAdapter.Exchange+Arca");
答案 2 :(得分:0)
我写了一个小的c#控制台应用程序来模拟你的需求,测试好了,希望它有所帮助:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MamdaAdapter;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IExchange SelectedExchange = Exchange.DeriveExchange("MamdaAdapter.Arca");
Console.WriteLine(SelectedExchange.GetTransport());
}
}
}
namespace MamdaAdapter
{
public interface IExchange
{
string GetTransport();
}
}
namespace MamdaAdapter
{
public class Arca : IExchange
{
private const string _Transport = "tportname";
public string GetTransport()
{
return _Transport;
}
}
}
namespace MamdaAdapter
{
public class Exchange
{
public static IExchange DeriveExchange(string ExchangeName)
{
IExchange SelectedExchange = (IExchange)Assembly.GetAssembly(typeof(IExchange)).CreateInstance(ExchangeName, false, BindingFlags.CreateInstance, null, null, null, null);
return SelectedExchange;
}
}
}
答案 3 :(得分:0)
如果您要查找的Type未在执行Type.GetType的同一程序集中定义,则必须使用AssemblyQualifiedName(类似MyNamespace.MyClass,MyAssembly,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = b17a5c561934e089) ),即使FullName也不够。否则,您可以首先获取包含该类的程序集,然后执行Assembly类的GetType方法。