1

我正在尝试获取可以将值分配给多个变量的 make 方法。我不知道我会有多少变量,但我知道它们的类型。不过,这些变量都可以是不同的类型。

我已经对此进行了相当多的搜索,并且相当确定这不能使用托管代码来完成。(如果我错了,请纠正我)

我对不安全代码知之甚少(阅读:任何东西)。可以那样做吗?也许传递一个指向我想要初始化的变量的指针数组并这样做?

我基本上是在寻找一种将任意数量的混合类型变量传递给方法并在方法内分配它们的值的方法......它是天上掉馅饼吗?

编辑1:

这是一些我希望能说明我想要实现的代码:

private void SomeMethod()
{
    string a = string.empty;
    int b = 0;
    double c = 0;

    object[] testObject = new object[] { b, c };

    SetVariables(ref testObject);
}

public static void SetVariables(ref object[] Variables)
{
    for (int i = 0; i < Variables.Length; i++)
        Variables[i] = // The value the variable needs to have
}

执行后SetVariables,a、b 和 c 会说:

a = "Some text"
b = 123
c = 1564.653

我正在寻找一种方法来访问作为参数传递给 SetVariables 的变量并修改它们的值。我想这意味着访问它们在内存中的存储位置,因此我认为我可能需要指针?

编辑2:

我在这里的问题应该更好地说明我试图这样做的背景。

我将只处理基本类型:字符串、int、double 和 bool,用于我要分配的变量。

我分配的数据是文本格式,并且具有可变数量的字段。每个字段都应该按照传入变量的顺序映射到其中一个输入变量。如果顺序不匹配,最好的情况是分配错误,或者最坏的情况是类型错误,但由用户决定确保变量与数据匹配。

4

3 回答 3

1

您尝试做的事情在 C# 中效果不佳。这实际上是一个语言问题,而不是“托管与非托管”的事情。

它通常不会出现那么多,因为在您的示例代码中,您确实知道您有 2 个变量。您必须键入它们才能将它们输入到数组中。

如果SetVariables()要从代码中的很多地方使用不同数量的参数调用,您可以对方法进行一堆重载(使用 1 个参数、2 个参数、3 个参数等)。

但说实话,通常当你遇到这种情况时,这是因为你以不明智的方式做某事。

多想一想,这条线会怎样:

Variables[i] = // The value the variable needs to have

预计将在这种情况下工作。它怎么知道将任意变量设置为什么,因为它可以是任何类型?b, c另外,如果我将调用从传入变量更改为反转它们,是什么阻止它弄乱变量分配c, b

从逻辑上讲,它开始分崩离析。

我想我想说的是 C# 不能很好地支持它,但它通常不需要,因为它很少有意义。


无论如何都试图想出一个可行的解决方案;我只会SetVariables返回值,但不接受参数。分配其变量应该是其他函数的工作。如果您需要知道类型,则只需传递类型:

public object[] GetValues(params Type types)
{
    var result = new object[types.length];
    for (int i = 0; i < types.length; i++)
    {
        if(types[i] == typeof(string))
            result[i] = "foo";
        if(types[i] == typeof(int))
            result[i] = -1;
    }
    return result;
}

public void DoStuff()
{
    var data = GetValues(typeof(string), typeof(int), typeof(string));
    string foo1 = (string)data[0];
    int someNumber = (int)data[1];
    string foo2 = (string)data[2];
}

它丑陋,但它的工作...

于 2012-11-08T01:43:50.333 回答
1

这是一个改编自this answer to a similar question的示例,不幸的是,您的问题有点难以解决,而且确实没有一种简单的方法可以完成您想要的。

private static void SomeMethod() {
    string a = string.Empty;
    int b = 0;
    double c = 0;

    SetVariables(x => a = (string)x
               , x => b = (int)x
               , x => c = (double)x);

    Console.WriteLine("a: {0}\nb: {1}\nc: {2}", a, b, c);
}

public static void SetVariables(params Action<object>[] setters) {
    var tokens = new object[] { "Hello", 10, 14.235 };
    for (int i = 0; i < setters.Length; i++)
        setters[i](tokens[i]); // Assumed this is read and initialized properly
}

我承认这有点味道,但由于您确实必须考虑变量输入,它应该让您更接近您想要的,而不会增加过多的复杂性。

于 2012-11-08T02:06:34.953 回答
0

我认为您自己非常接近答案。假设分配给变量的值仅基于它的类型,然后假设您使用上面发布的代码,您可以在 for 循环期间将值类型与 typeof() 检查进行比较:

if(Variables[i].GetType() == typeof(int)){
    //...do stuff
}

//etc...until you have an if for each data type you expect you might find

这是 typeof文档的链接

我假设您已经了解了如何使用引用类型,但以防万一请看这里

于 2012-11-08T01:40:00.943 回答