从C#中的字符串创建结构

时间:2010-01-08 21:13:10

标签: c# reflection dynamic structure

我已经看到很多关于从字符串中实例化类的问题,但是却无法以相同的方式找到有关创建结构的任何信息。

我有一个包含如下结构的类:

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进行编程。

3 个答案:

答案 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不起作用。