Comment append un atsortingbut à une propriété au moment de l’exécution

//Get PropertyDescriptor object for the given property name var propDesc = TypeDescriptor.GetProperties(typeof(T))[propName]; //Get FillAtsortingbutes methodinfo delegate var methodInfo = propDesc.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .FirstOrDefault(m => m.IsFamily || m.IsPublic && m.Name == "FillAtsortingbutes"); //Create Validation atsortingbute var atsortingbute = new RequiredAtsortingbute(); var atsortingbutes= new ValidationAtsortingbute[]{atsortingbute}; //Invoke FillAtsortingbute method methodInfo.Invoke(propDesc, new object[] { atsortingbutes }); 

Salut j’essaye d’append l’atsortingbut de validation à l’exécution en utilisant le code ci-dessus. Cependant, je reçois l’exception ci-dessous:

La collection était de taille fixe

Ne laissez pas quelqu’un vous dire que vous ne pouvez pas le faire. Vous pouvez courir pour président si vous voulez 🙂

Pour votre convenance, ceci est un exemple pleinement fonctionnel

 public class SomeAtsortingbute : Atsortingbute { public SomeAtsortingbute(ssortingng value) { this.Value = value; } public ssortingng Value { get; set; } } public class SomeClass { public ssortingng Value = "Test"; } [TestMethod] public void CanAddAtsortingbute() { var type = typeof(SomeClass); var aName = new System.Reflection.AssemblyName("SomeNamespace"); var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run); var mb = ab.DefineDynamicModule(aName.Name); var tb = mb.DefineType(type.Name + "Proxy", System.Reflection.TypeAtsortingbutes.Public, type); var attrCtorParams = new Type[] { typeof(ssortingng) }; var attrCtorInfo = typeof(SomeAtsortingbute).GetConstructor(attrCtorParams); var attrBuilder = new CustomAtsortingbuteBuilder(attrCtorInfo, new object[] { "Some Value" }); tb.SetCustomAtsortingbute(attrBuilder); var newType = tb.CreateType(); var instance = (SomeClass)Activator.CreateInstance(newType); Assert.AreEqual("Test", instance.Value); var attr = (SomeAtsortingbute)instance.GetType() .GetCustomAtsortingbutes(typeof(SomeAtsortingbute), false) .SingleOrDefault(); Assert.IsNotNull(attr); Assert.AreEqual(attr.Value, "Some Value"); } 

utiliser FastDeepCloner

 public class test{ public ssortingng Name{ get; set; } } var prop = now DeepCloner.GetFastDeepClonerProperties(typeof(test)).First(); prop.Atsortingbutes.Add(new JsonIgnoreAtsortingbute()); // now test and se if exist prop = now DeepCloner.GetFastDeepClonerProperties(typeof(test)).First(); bool containAttr = prop.ContainAtsortingbute() // or JsonIgnoreAtsortingbute myAttr = prop.GetCustomAtsortingbute(); 

Ce n’est pas parce FillAtsortingbutes méthode FillAtsortingbutes attend le paramètre de type IList et que vous passez le tableau. Ci-dessous l’implémentation de MemberDescriptor.FillAtsortingbutes :

 protected virtual void FillAtsortingbutes(IList atsortingbuteList) { if (originalAtsortingbutes != null) { foreach (Atsortingbute attr in originalAtsortingbutes) { atsortingbuteList.Add(attr); } } } 

Comme vous pouvez le voir, FillAtsortingbutes remplit simplement le paramètre atsortingbuteList avec tous les atsortingbuts de votre propriété. Et pour que votre code de travail change, var atsortingbutes= new ValidationAtsortingbute[]{atsortingbute}; aligner avec:

 var atsortingbutes = new ArrayList { atsortingbute }; 

Ce code n’a rien à append aux atsortingbuts de propriété de type à l’exécution. Ceci “ajoute un atsortingbut à PropertyDescriptor ” extrait du type et n’a aucun sens, sauf si vous essayez de générer le type à l’exécution qui est basé sur un type déjà existant.

Il n’est pas possible d’append des atsortingbuts au moment de l’exécution. Les atsortingbuts sont statiques et ne peuvent être ni ajoutés ni supprimés.

Questions similaires:

  • Les atsortingbuts peuvent-ils être ajoutés dynamicment en C #?
  • Supprimer l’atsortingbut C # d’une propriété de manière dynamic