我已经看到很多关于从字符串中实例化类的问题,但是却无法以相同的方式找到有关创建结构的任何信息。
我有一个包含如下结构的类:
Public Structure callDetails
Public GUID As Guid
Public ringTime as Date
Public CBN As String
等
我真正想做的就是从结构中获取字段名称。我不在乎操纵字段中的数据。
到目前为止,我可以与此非常接近。
callDetails callTableDef= new callDetails();
Type tableType = callTableDef.GetType();
object tableStruct = (object)Activator.CreateInstance(tableType);
System.Reflection.FieldInfo[] fields = tableType.GetFields();
foreach (System.Reflection.FieldInfo field in fields)
Debug.WriteLine(field.Name + " = " + field.GetValue(tableStruct));
但是,我仍然需要使用实际名称创建结构的实例。我希望能够传入这样的字符串:
Type tableType = System.Type.GetType("callDetails");
当我这样做时,我从Activator.CreateInstance()获得ArgumentNullException
getType是不是应该查找作为字符串传递给它的值并返回类型?
我是C#的新手,在这个项目之前主要使用Java进行编程。
答案 0 :(得分:5)
您必须使用其命名空间限定类型名称:
Type tableType = System.Type.GetType("mynamespace.callDetails");
如果它位于不同的程序集中,则需要程序集限定名称。可以找到详细信息on MSDN。只有你拥有的类型名称,它将无法解析并返回null
,因此你的参数为null异常。
答案 1 :(得分:1)
如果结构或类是可访问的,意味着你有一个对它的引用,最好使用GetType
,因为它采用struct / class而不是字符串。这意味着它会在出现错误时在编译时失败,并且还为您提供更好的重构可能性
Type tableType = GetType(callDetails)
在C#中:
Type tableType = typeof(callDetails);
答案 2 :(得分:0)
感谢大卫,
MSDN参考正是我所需要的。我尝试了很多方法,因为我知道如何。这堂课是在一个不同的集会。我试过了
Type tableType = System.Type.GetType("CommonTables.callDetails");
无效。
对于其他人来说,这是我必须要做的事情:
将以下内容写入调试后:
Debug.WriteLine("DEBUG ASSEMBLY QUALIFIED NAME= " + callTableDef.GetType().AssemblyQualifiedName.ToString());
它给了我这个
作为装配限定名称。
CommonTables.callDetails, callDetails, Version=3.0.4.0, Culture=neutral, PublicKeyToken=null
这就是我必须在getType()方法中使用的字符串。只是assembly.classname不起作用。