我想知道C#中是否可以使用点表示法来代替。例如,在Javascript中,我可以有一个这样的对象:
const myObj = { foo: "bar" }
然后我可以像这样引用它:
let x = "foo";
let y = myObj[x]; //sets y = "bar"
这在C#中可能吗?我还没有找到任何类似的东西,但是我想知道是否有其他功能可以起到类似的作用。
答案 0 :(得分:5)
您可以在您的课程中实现索引器:
public class A
{
public int X { get; set; }
public string Y { get; set; }
public object this[string name]
{
get => GetType().GetProperty(name).GetValue(this, null);
set => GetType().GetProperty(name).SetValue(this, value);
}
}
然后使用它:
var a = new A();
a["X"] = 10;
a["Y"] = "abc";
Console.WriteLine(a.X);
Console.WriteLine(a.Y);
答案 1 :(得分:0)
使用dynamic
可以有类似的东西,但是必须显式地获取字典接口才能使用数组语法。
dynamic myObject = new ExpandoObject();
myObject.greeting = "hello";
IDictionary<string, object> myDict = myObject;
Console.WriteLine(myDict["greeting"]);
请注意,它可以双向使用。您可以在之前的代码之后添加该代码:
myDict["name"] = "Joe";
Console.WriteLine(myObject.name);
如果您不介意使用myObject.something.name
之类的中间对象,则可以同时使用这两种语法。
代码如下:
void Main()
{
BothSyntax test= new BothSyntax();
test.dyn.greeting = "Hi";
Console.WriteLine(test["greeting"]);
test["name"] = "Joe";
Console.WriteLine(test.dyn.name);
}
class BothSyntax
{
public dynamic dyn => eo;
private ExpandoObject eo = new ExpandoObject();
public object this[string key]
{
get
{
return ((IDictionary<string, object>)eo)[key];
}
set
{
((IDictionary<string, object>)eo)[key] = value;
}
}
}