C#, .NET 3.5
I am trying to get all of the properties of an object that have BOTH a getter and a setter for the instance. The code I thought should work is
PropertyInfo[] infos = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.GetProperty);
However, the results include a property that does not have a setter. To give you a simple idea of my inheritance structure that might be affecting this (though I don’t know how):
public interface IModel { string Name { get; } } public class BaseModel<TType> : IModel { public virtual string Name { get { return 'Foo'; } } public void ReflectionCopyTo(TType target) { PropertyInfo[] infos = this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.GetProperty); foreach (PropertyInfo info in infos) info.SetValue(target, info.GetValue(this, null), null); } } public class Child : BaseModel<Child> { // I do nothing to override the Name property here }
I end up with the following error when working with Name:
System.ArgumentException: Property set method not found.
EDIT: I would like to know why this does not work, as well as what I should be doing to not get the error.
Call
GetGetMethodandGetSetMethodon the property – if both results are non-null, you’re there 🙂(The parameterless versions only return public methods; there’s an overload with a boolean parameter to specify whether or not you also want non-public methods.)