点符号替代

时间:2019-02-11 02:03:57

标签: c# .net

我想知道C#中是否可以使用点表示法来代替。例如,在Javascript中,我可以有一个这样的对象:

const myObj = { foo: "bar" }

然后我可以像这样引用它:

let x = "foo";
let y = myObj[x]; //sets y = "bar"

这在C#中可能吗?我还没有找到任何类似的东西,但是我想知道是否有其他功能可以起到类似的作用。

2 个答案:

答案 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;
        }
    }
}