aaro4130
aaro4130

Reputation: 115

Luatable equivalent in C#?

I've been looking for a way to make a table like thing in C# (3.5), but still have come up empty. Basically I want to do this

    var myClassVar = new myClass();
    myClassVar["hello"]["world"] = "hello world";
    myClassVar["hello"][0] = "swapped";
    myClassVar[0][0] = "test";
    myClassVar["hello"]["to"]["the"]["world"] = "again";
    myClassVar[0][1][0][0] = "same as above sorta";

I'm trying to create this type of class to parse a file format I've created for storing data. Does anyone know of something like this?

Upvotes: 2

Views: 480

Answers (1)

Jashaszun
Jashaszun

Reputation: 9270

public class LuaTable
{
    private Dictionary<object, dynamic> properties = new Dictionary<object, dynamic>();
    public dynamic this[object property]
    {
        get
        {
            if (properties.ContainsKey(property))
                return properties[property];
            LuaTable table = new LuaTable();
            properties.Add(property, table);
            return table;
        }
        set
        {
            if (!properties.ContainsKey(property))
                properties.Add(property, value);
            else
                properties[property] = value;
        }
    }
}

You can use it exactly how you want to:

var myClassVar = new LuaTable();
myClassVar["hello"]["world"] = "hello world";
myClassVar["hello"][0] = "swapped";
myClassVar[0][0] = "test";
myClassVar["hello"]["to"]["the"]["world"] = "again";
myClassVar[0][1][0][0] = "same as above sorta";

string s1 = myClassVar["hello"]["world"]; // = "hello world"
string s2 = myClassVar["hello"][0]; // = "swapped"
string s3 = myClassVar[0][0]; // = "test"
string s4 = myClassVar["hello"]["to"]["the"]["world"]; // = "again"
string s5 = myClassVar[0][1][0][0]; // = "same as above sorta"

Edit: I just realized C# 3.5 doesn't have dynamic, so here's a version that simply uses generics. I hope that this is fine (since you really have to have all of the child properties of your table be of the same type (in this case, string):

public class LuaTable<T> where T : class
{
    private bool isValue;
    private T value = null;
    private Dictionary<object, LuaTable<T>> properties = new Dictionary<object, LuaTable<T>>();

    public static implicit operator LuaTable<T>(T val)
    {
        if (val is LuaTable<T>)
            return (LuaTable<T>)val;
        return new LuaTable<T>() { isValue = true, value = val };
    }
    public static implicit operator T(LuaTable<T> table)
    {
        if (table.isValue)
            return table.value;
        return table;
    }

    public LuaTable<T> this[object property]
    {
        get
        {
            if (isValue)
                return null;

            if (properties.ContainsKey(property))
                return properties[property];
            LuaTable<T> table = new LuaTable<T>();
            properties.Add(property, table);
            return table;
        }
        set
        {
            if (!properties.ContainsKey(property))
                properties.Add(property, value);
            else
                properties[property] = value;
        }
    }
}

To use it, it's almost exactly the same as above. Just change the first line:

var myClassVar = new LuaTable<string>();

Upvotes: 2

Related Questions