vendredi 15 février 2019

Property SetValue returns TargetParameterCountException

TL;DR

I have the class Type for a XmlSerializer which throws a TargetParameterCountException on prop.SetValue().

Class Type

The class is called from my List Types

[System.Xml.Serialization.XmlArrayItemAttribute("Type", IsNullable = false)]
public List<Type> Types { get; set; }

and the class itself

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class Type
{
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int TypeCode { get; set; }

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int NumberOfUnits { get; set; }
    public bool ShouldSerializeNumberOfUnits() { return NumberOfUnits > 0; }
}

My Property Set Funktion

From: Xerillio answer for "Insert values in class without explicit writing them"

public static void SetDefaults(object testObj)
{
    PropertyInfo[] propertyInfos = testObj.GetType().GetProperties();
    foreach (PropertyInfo propertyInfo in propertyInfos)
    {
        if (propertyInfo.Name == "Count" || propertyInfo.Name == "Capacity" || propertyInfo.SetMethod == null)
        {
            continue;
        }

        var propType = propertyInfo.PropertyType;
        if (propType == typeof(int))
        {
            // [...]
        }
        else
        {
            var ctor = propType.GetConstructor(Type.EmptyTypes);
            var propertyObject = ctor.Invoke(new object[0]);
            SetDefaults(propertyObject);
            propertyInfo.SetValue(testObj, propertyObject);
        }
    }
}

The Problem

Now if the propertyObject is written and ready to be set in propertyInfo it through the TargetParameterCountException.
May it has something to do with the unset index and count properties, but I can't find anything by STFW.

Do I need to set the count and index properties anywhere or does it have a problem with the ShouldSerialize... Variable?





Aucun commentaire:

Enregistrer un commentaire