例如,如果我想做这样的事情:
class Program
{
static void Main(string[] args)
{
var dictionary = new Dictionary<string, Property<AddressInfo>>
{
{ "f", (thing) => thing.Foo },
{ "o", (thing) => thing.Foo },
{ "o", (thing) => thing.Foo },
{ "b", (thing) => thing.Bar },
{ "a", (thing) => thing.Bar },
{ "r", (thing) => thing.Bar },
};
}
}
class Thing
{
public string Foo { get; set; }
public string Bar { get; set; }
}
否则,我必须将getter和setter分别存储为Func和Action。
答案 0 :(得分:1)
我没有找到执行此操作的任何本机方法,但是您可以创建一个可以执行此操作的结构。 免责声明:我确实实现了它,因为这样做很有趣。我没有进行测试,所以它只是一个想法,我怀疑它是否有效。
public class PropertyHolder<T, Y>
{
private static object[] emptyArray = new object[0];
public PropertyHolder(Y instance, string propertyName)
{
var property = typeof(Y).GetProperty(propertyName);
var setMethod = property.SetMethod;
var getMethod = property.GetMethod;
Set = (t) => setMethod.Invoke(instance, new object[]{t});
Get = () => (T) getMethod.Invoke(instance, emptyArray);
}
public Action<T> Set { get; private set; }
public Func<T> Get { get; private set; }
}
您可以通过以下方式使用它:
public class Toto
{
public int TheInt { get; set; }
}
var x = new Toto();
var propPointer = new PropertyHolder<int,Toto>(x, nameof(Toto.TheInt));
答案 1 :(得分:0)
是否可以在C#中存储指向属性的指针?
不,基本上。
如果它是ref
返回属性,则可以很接近,但也不能存储ref
-您只能在堆栈上使用它。