C#中具有已命名非只读类型的匿名类

时间:2014-09-03 15:37:32

标签: c#

目前我正在采取以下措施:

public class UselessClass
{
    public string x;
    public int y;
}

我只在函数中使用过这个类......

Dictionary<string, UselessClass> dict;

我希望能够编辑UselessClass的值,所以我认为一个元组是不够的,因为它们在创建后是只读的。我还想让命名变量x和y执行以下操作:

dict["hello"].y++;

我是否可以这样做而不必让这个UselessClass坐在代码周围真的它只用过一次函数?某种具有命名变量的匿名类?

添加更多详情:

这纯粹用在一个算法函数中,我想用一些变量连接一个字符串,即另一个字符串x和一个表示距离的整数

我可以考虑通过使用字典来为已经存在的类(如字符串)添加属性的最佳方法。

而不是:

Dictionary<string, string> names;
Dictionary<string, int> distances;

这似乎浪费了记忆,我宁愿在相同的结构中获得名称和距离。

但结构本身本身没有意义,它只在算法中用于执行计算。

3 个答案:

答案 0 :(得分:3)

不 - 匿名类型是不可变的。如果你想要一个可变类型使用一个类(不是结构)。使用dynamicExpandoObject将是一种替代方案,但您会失去设计时类型安全性。

如果您提供更多上下文如何使用,可能还有其他选择。

答案 1 :(得分:1)

一种可能性就像你说过使用Tuple但是因为他们的元素无法改变你可以做一点“黑客”如果你想调用它是宣告Tuple<int[],string[]>所以当你在词典中添加一个项目时实例化元组,但每个数组中只有1个元素可以操作:

Dictionary<string,Tuple<int[],string[]>> test = new Dictionary<string, Tuple<int[],string[]>>();
//here i add a new dict entry and to the int[] i assign the value 5.
test.Add("test1", new Tuple<int[], string[]>(new int[1]{5}, new string[1]));
test["test1"].Item1[0]++;
test["test1"].Item1[0]++;
//here the int will be 7.

虽然我会使用UselessClass ......

答案 2 :(得分:1)

为了提供类似于terrybozzio的解决方案,虽然不那么hackish(使用单元素数组并不是那么好),但你也可以使用一个使类型可变的包装器:

class Mutable<T>
{
    public Mutable(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}

您甚至可以将此用于匿名类型:

var x = new {
    Foo = "Bar",
    Baz = new Mutable<int>(2)
};

Console.WriteLine(x.Baz.Value); // 2
x.Baz.Value++;
Console.WriteLine(x.Baz.Value); // 3

但正如我在上面的评论中所说,如果需要在字典声明中引用类型,则无法真正使用匿名类型。您可以使用元组,但总体而言,如果您只是引入自定义类型,则可以获得更大的灵活性。例如,如果您决定在那里需要另一个值(无论出于何种原因),那么您可以简单地添加它而不会破坏所有内容。另一方面,如果你使用元组或类似的东西,你将不得不更新它的每一次使用。