You can use reflection, you can get a MethodInfo object for the get/set accessors and call it's Invoke method.
The code example assumes you have both a get and set accessors and you really have to add error handling if you want to use this in production code:
For example to get the value of property Foo of object obj you can write:
value = obj.GetType().GetProperty("Foo").GetAccessors()[0].Invoke(obj,null);
to set it:
obj.GetType().GetProperty("Foo").GetAccessors()[1].Invoke(obj,new object[]{value});
So you can pass obj.GetType().GetProperty("Foo").GetAccessors()[0] to your method and execute it's Invoke method.
an easier way is to use anonymous methods (this will work in .net 2.0 or later), let's use a slightly modified version of your code example:
delegate RET FunctionDelegate<T, RET>(T t);
void func<T, RET>(FunctionDelegate<T,RET> function, T param, ...)
{
...
return function(param);
}
for a property named Foo of type int that is part of a class SomeClass:
SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);