【问题标题】:Providing a DynamicObject properties提供 DynamicObject 属性
【发布时间】: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.xyzns1.Resource2.xyz
  • 我无法理解你的问题,你能澄清一下动态需要的地方吗?
  • 也可以选择 ExpandoObject (docs.microsoft.com/en-us/dotnet/api/…)。但是在任何情况下,您都需要实例化一个对象(当然可以是单例)。为什么这不可能?
  • @MartinParkin 是的。
  • 编译器怎么知道你使用的是什么类型,动态命名空间不存在。最接近您的是public static ExpandoObject Resource

标签: c# dynamicobject


【解决方案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 = 不管;等等

【讨论】:

    【解决方案2】:

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

    namespace ns1{
    
    public static class Resource {
    
        public static string Field1 = "hello-f1";
        public static string Field2 = "hello-f2";
    }}
    

    之后你可以通过调用来使用这个变量 请注意,Fields 变量不是 const,因此您可以在任何地方更改它

    【讨论】:

    • 这迫使我提前声明每个成员。我希望成员被动态设置和获取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多