我正在尝试使用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:
My question here应该更好地指示我尝试这样做的背景。
我只会处理基本类型:string,int,double和bool,用于我想要分配的变量。
我分配的数据是文本格式,并且具有可变数量的字段。每个字段应按照传递变量的顺序映射到输入变量之一。如果顺序不匹配,最好是错位或最坏的类型错误,但是由用户决定确保变量与数据匹配。
答案 0 :(得分: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];
}
它很难看,但它有效......
答案 1 :(得分: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
}
我会承认这有一点味道,但是因为你真的需要考虑一个变量输入,它应该让你更接近你想要的而不会增加过多的复杂性。
答案 2 :(得分: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
这是指向documentation
类型的链接我假设您已经了解了如何使用引用类型,但以防万一here