提供DynamicObject属性

时间:2018-11-11 10:50:08

标签: c# dynamicobject

我需要一种提供动态get成员并为给定类设置的方法。 我希望能够编写如下代码:

ns1.Resource.Field1 = "Hello";
string myField = ns1.Resource.Field1;

其中ns1是名称空间,我相信“ Resource”是类名,而Field1或任何其他属性是动态的。 那么如何声明这样的类呢?

我已经学习了有关从“ DynamicObject”继承Resource类的知识,但是它迫使我将Resource类实例化为一个对象,这是我不想执行的操作。

编辑#1:
我想创建一种使用此类的方法:

Namespace.Resource.DynamicField = "Value";
string myValue = Namespace.Resource.DynamicField;

不应实例化“资源”,并且DynamicField是我的类将能够处理其get和set调用的成员,因此,如果在代码中的某个地方,我可以编写

Namespace.Resource.DynamicField2 = "Hello";

我将有一个地方可以覆盖对Resource的静态属性“ DynamicField2”的set调用。但是我不知道该类的完整属性列表,因此我需要动态创建属性,并能够像通过“名称”传递它一样来控制get和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" 

2 个答案:

答案 0 :(得分:1)

看看ExpandoObject:

https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=netframework-4.7.2

它应该满足您的需求。

编辑。

您可以在Resource类中创建一个静态属性,以访问ExpandoObject的单例实例。

例如

public static class Resource
{
     public static dynamic Data {get;} = new ExpandoObject();
}

然后只需将Resource.Data.Field1 =设置为任何值;等

答案 1 :(得分:0)

我不太了解你的意思。但是,如果您想要具有这样的值(不创建对象)。您可以像这样将类和var声明为静态:

namespace ns1{

public static class Resource {

    public static string Field1 = "hello-f1";
    public static string Field2 = "hello-f2";
}}

之后,您可以通过调用 请注意,Fields变量不是const,因此您可以在任何地方进行更改