gpt4 book ai didi

c# - 从嵌套类中的 Controller 中的 DynamicObject 继承的对象无法在 ActionMethod 中创建属性

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:39 24 4
gpt4 key购买 nike

我在嵌套类的 Controller 中继承自 DynamicObject,当我尝试在 ActionMethod 中创建属性时,它失败了。

SearchController.MyClass' does not contain a definition for 'Test'错误,但是类是在 Controller 本身中声明的,所以我看不出它是如何不可见的。

public class MyClass : DynamicObject
{
public string Prop { get; set; }
}

public ActionResult Test()
{
var test = ((dynamic)new MyClass()).Test = "sfdsdf"; // KABOOM here
....
}

继承DynamicObject时如何设置动态属性,为什么会失败?

最佳答案

似乎您期待 ExpandoObject 提供的行为.然而,DynamicObject只是

a base class for specifying dynamic behavior at run time.

类本身不提供任何功能,但通过仅重写您需要的方法来帮助您实现该功能,如文档的备注部分所述:

To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. For example, if you need only operations for setting and getting properties, you can override just the TrySetMember and TryGetMember methods.

因此,为了支持在运行时动态添加属性,您应该像这样声明一些存储并处理上述方法(注意它们不会为您的类的真实属性调用):

public class MyClass : DynamicObject
{
public string Prop { get; set; }

Dictionary<string, object> dynamicMembers = new Dictionary<string, object>();

public override bool TrySetMember(SetMemberBinder binder, object value)
{
dynamicMembers[binder.Name] = value;
return true;
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return dynamicMembers.TryGetValue(binder.Name, out result);
}
}

现在这将起作用:

var c = (dynamic)new MyClass();
c.Test = "sfdsdf"; // No KABOOM here :)

关于c# - 从嵌套类中的 Controller 中的 DynamicObject 继承的对象无法在 ActionMethod 中创建属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com