【发布时间】:2018-11-11 10:50:08
【问题描述】:
我需要一种方法来为给定类提供动态获取成员和设置。 我希望能够编写这样的代码:
ns1.Resource.Field1 = "Hello";
string myField = ns1.Resource.Field1;
ns1 是命名空间,我相信“资源”是类名,Field1 或任何其他属性是动态的。 那么如何声明这样的类呢?
我已经了解了从“DynamicObject”继承 Resource 类,但它迫使我将类 Resource 实例化为一个对象,这是我不想做的操作。
编辑#1:
我想创建一种使用这样的类的方法:
Namespace.Resource.DynamicField = "Value";
string myValue = Namespace.Resource.DynamicField;
“资源”不应该被实例化,而 DynamicField 是我的类将能够处理它的 get 和 set 调用的成员,所以如果我在代码中的某个地方编写
Namespace.Resource.DynamicField2 = "Hello";
我将有一个地方可以覆盖对 Resource 的静态属性“DynamicField2”的 set 调用。但是我不知道该类的完整属性列表,所以我需要动态创建属性并能够控制获取和设置,就像它通过“名称”传递一样让我们说:
public class Resource{
public static getMember(string Name){
console.log(Name); //=> this will output "DynamicField2"
return this.dictionary["Name"];
}
}
然后在代码的某个地方使用它
string a = Resource.DynamicField2; // a will be value "Hello"
【问题讨论】:
-
您是说您还希望类名是动态的吗?这样您就可以在不声明任何一个类的情况下放置
ns1.Resource.xyz和ns1.Resource2.xyz? -
我无法理解你的问题,你能澄清一下动态需要的地方吗?
-
也可以选择 ExpandoObject (docs.microsoft.com/en-us/dotnet/api/…)。但是在任何情况下,您都需要实例化一个对象(当然可以是单例)。为什么这不可能?
-
@MartinParkin 是的。
-
编译器怎么知道你使用的是什么类型,动态命名空间不存在。最接近您的是
public static ExpandoObject Resource
标签: c# dynamicobject