我有一个带有公共字段b的A类
class A
{
public static string b;
}
但现在我想制作b dynamic
所以我称之为任何东西。所以我可以让课程为DynamicObject
class A : DynamicObject
{
}
但我编译器现在不让我调用A.dynamicThing
因为我必须将A实例化为动态。
如何进一步修改c#以使其工作?
答案 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!";
}
}