Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射设置复合类的值_C#_Class_Reflection_Composite - Fatal编程技术网

C# 使用反射设置复合类的值

C# 使用反射设置复合类的值,c#,class,reflection,composite,C#,Class,Reflection,Composite,我正在尝试创建一个对象的实例,该对象中还包含组成该对象的类: [DataContract(Name = "share", Namespace = "")] public class RequestShareDocument { [DataMember(Order = 0)] public string profile_name { get; set; } [DataMember(Order = 1)] public List<RequestSigner>

我正在尝试创建一个对象的实例,该对象中还包含组成该对象的类:

[DataContract(Name = "share", Namespace = "")]
public class RequestShareDocument
{
    [DataMember(Order = 0)]
    public string profile_name { get; set; }
    [DataMember(Order = 1)]
    public List<RequestSigner> signers {get; set;}
    [DataMember(Order = 2)]
    public bool createcopy { get; set; }
}

[DataContract(Name = "signer", Namespace = "")]
public class RequestSigner
{
    [DataMember(Order = 0)]
    public string email { get; set; }
    [DataMember(Order = 1)]
    public string order { get; set; }
    [DataMember(Order = 2)]
    public string reminder { get; set; }
    [DataMember(Order = 3)]
    public RequestSignerPermissions permissions { get; set; }
    [DataMember(Order = 4)]
    public string signature_field { get; set; }
}

[DataContract(Name = "permissions", Namespace = "")]
public class RequestSignerPermissions
{
    [DataMember(Order = 0)]
    public bool save_locally {get;set;}
    [DataMember(Order = 1)]
    public string open_password { get; set; }
    [DataMember(Order = 2)]
    public DateTime accessible_after { get; set; }
    [DataMember(Order = 3)]
    public DateTime accessible_before { get; set; }
    [DataMember(Order = 4)]
    public string certify_level { get; set; }
}

问题是当我循环所有属性并到达
列表时,我不知道如何创建
列表的实例。是否可能,或者我做错了什么?

如果我理解正确,此代码可以满足您的要求:

public static object InitializeTarget(Type type)
    {
        object target = CreateObject(type);
        foreach (PropertyInfo propertyInfo in type.GetProperties())
        {
            if (propertyInfo.PropertyType.IsClass && propertyInfo.CanWrite
                && propertyInfo.PropertyType != typeof(string)
                && (propertyInfo.IsDefined(typeof(DataMemberAttribute), true)))
                propertyInfo.SetValue(target, InitializeTarget(propertyInfo.PropertyType), null);
        }
        return target;
    }

    public static object CreateObject(Type type)
    {
        if (typeof(IList).IsAssignableFrom(type) && type.IsGenericType)
        {
            Type[] genericArguments = type.GetGenericArguments();
            if (genericArguments.Length == 1)
            {
                var list = (IList)Activator.CreateInstance(type);
                //Adding default value
                list.Add(CreateObject(genericArguments[0]));
                return list;
            }
        }
        //If the object is only to serialize, you can use it
        return FormatterServices.GetUninitializedObject(type);
        //or
        //            return Activator.CreateInstance(type);
    }

您是否尝试过这样做:
if(typeof(IList).IsAssignableFrom(item.PropertyType)){IList list=(IList)Activator.CreateInstance(item.PropertyType);
我已经厌倦了它,它创建了list的实例,但问题是如何添加创建了list的类的对象。IList list=(IList)Activator.CreateInstance(item.PropertyType);现在我得到了计数为0的列表对象
XmlSerializer mySerializer = new XmlSerializer(typeof(T), new
    XmlRootAttribute(RootElementName));       
StringWriter sww = new StringWriter();
XmlWriter writer = XmlWriter.Create(sww, new XmlWriterSettings()
    { OmitXmlDeclaration = true, Indent = true });
mySerializer.Serialize(writer, item);
writer.Close();
sww.Close();
public static object InitializeTarget(Type type)
    {
        object target = CreateObject(type);
        foreach (PropertyInfo propertyInfo in type.GetProperties())
        {
            if (propertyInfo.PropertyType.IsClass && propertyInfo.CanWrite
                && propertyInfo.PropertyType != typeof(string)
                && (propertyInfo.IsDefined(typeof(DataMemberAttribute), true)))
                propertyInfo.SetValue(target, InitializeTarget(propertyInfo.PropertyType), null);
        }
        return target;
    }

    public static object CreateObject(Type type)
    {
        if (typeof(IList).IsAssignableFrom(type) && type.IsGenericType)
        {
            Type[] genericArguments = type.GetGenericArguments();
            if (genericArguments.Length == 1)
            {
                var list = (IList)Activator.CreateInstance(type);
                //Adding default value
                list.Add(CreateObject(genericArguments[0]));
                return list;
            }
        }
        //If the object is only to serialize, you can use it
        return FormatterServices.GetUninitializedObject(type);
        //or
        //            return Activator.CreateInstance(type);
    }