【问题标题】:Get the handle of a member of a class that has no instantiation yet获取尚未实例化的类成员的句柄
【发布时间】:2016-10-19 09:17:22
【问题描述】:

这个问题与this one 有关联(但不重复)。考虑到我对 C# 相当陌生。 如果可能的话,我想获取尚未实例化的对象的成员的句柄,以便以后使用它。在上一个问题之后,我想做类似的事情

List<Action<YourClass>> lst = new List<Action<YourClass>>;

lst.Add(x => x.Member1);
lst.Add(x => x.Member2);

Member1 和 Member2 不应该是静态成员,因为它们的值取决于它们所属的对象的状态。基本上我想要他们的“名称”的句柄,以便稍后在实例化对象时可以使用它。我正在考虑一种基于字符串的方法,其值为成员名称,但也许有更好的方法? 谢谢。

【问题讨论】:

  • x =&gt; x.Member1 不是Action&lt;T&gt;,而是Func&lt;T,V&gt;。这让整个问题变得难以理解。
  • 希望这更清楚。

标签: c# function-handle


【解决方案1】:

我不确定我是否理解正确。首先,您需要从列表中创建一个实例。

List<Action<YourClass>> lst = new List<Action<YourClass>>;

否则,您的 Add 将因 NullReference-Exception 而中断。您在 Add 中使用的内容称为匿名函数,因为未保存句柄。如果您想存储它,您需要一个delegate。在这个委托上,您可以调用 Invoke-Methode 来调用它。您可以创建您的代理以及使用预定义的操作。

这是一个没有任何意义的小例子,但也许可以澄清一下:

    var action = new Action<string>(x => x = x.Substring(1, 1));
    //Do some other stuff
    action.Invoke("Hallo");

注意使用了var关键字。它检测新 Action 的结果并采用 this 的类型。在这种情况下,它持有 Action。

进一步注意,Action 是一个预定义的委托。另一个是 Func,它得到一个返回值。如果您需要其他行为,您可以轻松创建自己的委托。为此,您应该阅读链接。

【讨论】:

  • 我正在检查你的答案,看看它是否符合我的要求..
  • 我想做的是匿名访问对象的成员,而不是方法。
【解决方案2】:

感谢 Henk 评论,我找到了解决方案:

Func<myObj, Vector> getVect = new Func<myObj, Vector> 
getVect= (myObj => myObj.objVector);

其中 objVector 不是方法,而是 myObj 的成员。 我以这种方式调用 getVect:

Vector a= getVect(someObj)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多