Puede usar la reflexión, puede obtener un objeto MethodInfo para los accesadores get/set y llamar a su método Invoke.
El ejemplo de código se supone que tienen tanto un acceso get y set y que realmente tienen que añadir gestión de errores si quiere utilizar esto en el código de producción:
Por ejemplo, para obtener el valor de la propiedad de Foo del objeto obj puede escribir:
value = obj.GetType().GetProperty("Foo").GetAccessors()[0].Invoke(obj,null);
para configurarlo:..
obj.GetType().GetProperty("Foo").GetAccessors()[1].Invoke(obj,new object[]{value});
lo que puede pasar obj.GetType() GetProperty ("foo") GetAccessors() [0] a su método y ejecutar su método Invoke.
una manera más fácil es utilizar métodos anónimos (esto funcionará en .NET 2.0 o posterior), vamos a usar una versión ligeramente modificada de su código de ejemplo:
delegate RET FunctionDelegate<T, RET>(T t);
void func<T, RET>(FunctionDelegate<T,RET> function, T param, ...)
{
...
return function(param);
}
de una propiedad denominada Foo de tipo int que es parte de una clase SomeClass: la respuesta de aku::
SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);
Esa es una muy buena idea a lo largo del principio KISS. Desafortunadamente en este momento no puedo usarlo :( El problema es que la propiedad que estoy usando no es parte de mi código. Y escribir un contenedor agrega sobrecarga No quiero en este punto –