我想要一个动态静态字段

时间:2011-03-26 21:58:25

标签: c# dynamic

我有一个带有公共字段b的A类

class A
{
    public static string b;
}

但现在我想制作b dynamic所以我称之为任何东西。所以我可以让课程为DynamicObject

class A : DynamicObject
{
}

但我编译器现在不让我调用A.dynamicThing因为我必须将A实例化为动态。

如何进一步修改c#以使其工作?

6 个答案:

答案 0 :(得分:2)

我想我现在明白了 - 你最接近的是使用ExpandoObject

dynamic foo = new ExpandoObject();
foo.somethinghere = "bar";
foo.dynamicThing = "baz";

修改

我认为不可能重新路由对类的静态属性的访问 如果属性的名称不匹配,则为expando对象 - 编译器将如何知道这是您的意图?毕竟你得到一个编译时错误,而不是运行时错误。

来自MSDN

  

当一个字段,方法,属性,事件,   运算符或构造函数声明   它包括一个静态修饰符   声明一个静态成员。此外,   常量或类型声明   隐式声明一个静态成员。   静态成员具有以下内容   特性:

 When a static member M is referenced in a member-access (Section 7.5.4) 
 of the form E.M, E must denote a type containing M.
 ...

答案 1 :(得分:2)

现在使用.NET 4

是不可能的

article中的更多信息。

答案 2 :(得分:2)

我不相信你会找到一种方法来完成这项工作。不仅仅是使事物有效的DynamicObject。声明作为“动态”数据类型的变量,告诉编译器实际上使用 DynamicObject库来解析成员访问。通过直接访问类的静态访问,您没有。所以我真的不认为这会在C#中起作用,除非将来发生变化。

答案 3 :(得分:1)

public class FakeDynamicMethodInvoker : DynamicObject
{
    // your code here
}
public class FakeDynamicWrapper<T>
{
    static FakeDynamicWrapper()
    {
        DynamicStaticField = (dynamic)new FakeDynamicMethodInvoker();
    }
    public static T DynamicStaticField{ get; set; }
}
public class RealClassWithDynamicStaticField: FakeDynamicWrapper<dynamic>
{

}

代码中的某个地方:

RealClassWithDynamicStaticField.DynamicStaticField.AnyMethod();

答案 4 :(得分:0)

C#不允许您在运行时将变量重命名为某个动态名称。你的问题被破坏了。

如果您希望变量b在运行时拥有动态对象,请使用动态关键字。

示例:

dynamic b = GetBValue();
b.SomeOperation(); // the type of "b" will be evaluated/chosen at runtime.

答案 5 :(得分:0)

老问题但值得回答:)

静态构造函数是解决这些问题的答案。

https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx

public class MyClass
{
    public static dynamic StaticDynamicObject;

    static MyClass()
    {
        StaticDynamicObject = new ExpandoObject();
        StaticDynamicObject.Prop = "woohoo!";
    }
}