0

我正在尝试使用 YAXLib 处理 XML,但是每当我尝试使用 int、double 或 float 字段序列化类时,都会崩溃。YAXLib 尝试调用

DefaultValue = MemberType.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, new object[0]);

MemberType对象在哪里System.Int32 Type

当然 Int32 没有要调用的构造函数。我试图了解这首先是如何工作的。这是在新版本的 mono/C# 中引入的东西吗?

这是在 Unity3d 中,带有 Mono,.NET 2.0.5

MissingMethodException: Constructor on type 'System.Int32' not found.
System.MonoType.InvokeMember (System.String name, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object target, System.Object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, System.String[] namedParameters) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/MonoType.cs:398)
System.Type.InvokeMember (System.String name, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object target, System.Object[] args) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Type.cs:1149)
YAXLib.MemberWrapper.InitDefaultValue () (at Assets/Vendor/YAXLib/MemberWrapper.cs:691)
YAXLib.MemberWrapper.InitInstance () (at Assets/Vendor/YAXLib/MemberWrapper.cs:682)
YAXLib.MemberWrapper..ctor (System.Reflection.MemberInfo memberInfo, YAXLib.YAXSerializer callerSerializer) (at Assets/Vendor/YAXLib/MemberWrapper.cs:122)
YAXLib.YAXSerializer+<GetFieldsToBeSerialized>c__Iterator1.MoveNext () (at Assets/Vendor/YAXLib/YAXSerializer.cs:2815)
YAXLib.YAXSerializer.SerializeBase (System.Object obj, System.Xml.Linq.XName className) (at Assets/Vendor/YAXLib/YAXSerializer.cs:722)
YAXLib.YAXSerializer.SerializeBase (System.Object obj) (at Assets/Vendor/YAXLib/YAXSerializer.cs:609)
YAXLib.YAXSerializer.SerializeXDocument (System.Object obj) (at Assets/Vendor/YAXLib/YAXSerializer.cs:539)
YAXLib.YAXSerializer.Serialize (System.Object obj) (at Assets/Vendor/YAXLib/YAXSerializer.cs:349)
DataHandler..ctor () (at Assets/DataWrangling/DataHandler.cs:36)
YAXTestHarness.Start () (at Assets/DataWrangling/YAXTestHarness.cs:8)
4

1 回答 1

1

也许您想获得最新版本的 YAX 之类的?

我刚刚搜索了 YAXLib MemberWrapper 并找到了https://github.com/sinairv/YAXLib/blob/master/YAXLib/MemberWrapper.cs

有那个方法你有例外在实现如下:

    private void InitDefaultValue()
    {
        if(MemberType.IsValueType)
            DefaultValue = MemberType.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, new object[0]);
        else
            DefaultValue = null;
    }

所以我稍微修改了它并从控制台应用程序调用,它工作得很好,返回 0。

    private static object InitDefaultValue(Type MemberType)
    {
        if (MemberType.IsValueType)
            return MemberType.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, new object[0]);
        else
            return null;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(InitDefaultValue(typeof(System.Int32)));
    }

这使我相信 YAXLib 和您正在使用的单声道版本之间存在一些不兼容,因为它转换为“通过调用默认构造函数创建实例”并且也应该在单声道下工作。

于 2016-02-24T04:14:44.987 回答