C# 同时收集名称和对象
我正在尝试组合一个类,该类将收集一本词典。然后稍后将这些对象打印到控制台。主要是为了让您可以在不调试每个测试用例的情况下查看多个测试用例的最终运行时值,并避免大量手动Console.WriteLinesC# 同时收集名称和对象,c#,C#,我正在尝试组合一个类,该类将收集一本词典。然后稍后将这些对象打印到控制台。主要是为了让您可以在不调试每个测试用例的情况下查看多个测试用例的最终运行时值,并避免大量手动Console.WriteLines private Dictionary Localvars=new Dictionary(); public void InsertEntry(字符串objectName、对象objectToAdd、字符串描述) { Add(objectName+$“:{description}”,object
private Dictionary Localvars=new Dictionary();
public void InsertEntry(字符串objectName、对象objectToAdd、字符串描述)
{
Add(objectName+$“:{description}”,objectToAdd);
}
公共静态void Main(字符串[]args)
{
var d=新的Demo();
var charizard=“看起来像龙的火型”;
var blanoise=“类似海龟的水型,炮筒从壳中伸出”;
var pikachu=“类似可爱的电动啮齿动物的电动类型”;
d、 插入(姓名(charizard),charizard,“第一个”);
d、 插入(名称为(blanoise),blanoise,“第二个”);
d、 插入(姓名(皮卡丘),皮卡丘,“第三个”);
d、 PrintVars();
}
private Dictionary Localvars=new Dictionary();
public void InsertEntry(object objectToAdd,string description=“”)
{
Add(nameof(objectToAdd)+$“:{description}”,objectToAdd);
}
public void InsertEntry(参数对象[]objectToAdd)
{
Add(nameof(objectToAdd),objectToAdd);
}
公共静态void Main(字符串[]args)
{
var d=新的Demo();
var charizard=“看起来像龙的火型”;
var blanoise=“类似海龟的水型,炮筒从壳中伸出”;
var pikachu=“类似可爱的电动啮齿动物的电动类型”;
//这是我理想的工作方式
d、 插入(查里扎德);
d、 插入(胚芽插入);
d、 插入(皮卡丘);
//或者,如果这个方法可以采用params,这会更好。我想这将是相同的解决方案。
d、 插入法(charizard、pikachu、blastoise);
d、 PrintVars();
}
现在我知道它为什么会质疑这个错误了。它抱怨“已经添加了具有相同键的项”,因为当我尝试获取变量的名称时,它被作为参数objectToAdd传入。这意味着字典中的键被设置为objectToAdd,而不是charizard、blanoise或pikachu
显然,我可以使用nameof将其作为字符串传递,这比我在其他地方看到的内存表达式可读性好得多。是否有某种方法可以将对象作为参数传递给另一个方法,以便我可以同时获得名称和内容(如果是成员)?我已经回顾了各种想法,例如ref和out关键字,但它们似乎不是我想要的。“是否有某种方法可以将对象作为参数传递给另一个方法,以便获得成员的名称和内容?”
var charizard=“火灾类型…”;
Foo(()=>charizard);
私有void Foo(表达式memberExpression)
{
var memberName=GetMemberName(memberExpression);/“charizard”
var expressionValue=memberExpression.Compile().Invoke();/“火灾类型…”
}
私有字符串GetMemberName(表达式memberExpression)
{
var expressionBody=(MemberExpression)MemberExpression.Body;
返回expressionBody.Member.Name;
}
注意,这只适用于“成员表达式”,即()=>变量、属性、字段;否则它将抛出。据我所知,这是在C#中实现这一点的唯一方法。另请注意,可以将params Expression[]
作为参数(然后Foo(()=>charizard,()=>pikachu,…);
是否有某种方法可以将对象作为参数传递给另一个方法,以便获得成员的名称和内容?”
var charizard=“火灾类型…”;
Foo(()=>charizard);
私有void Foo(表达式memberExpression)
{
var memberName=GetMemberName(memberExpression);/“charizard”
var expressionValue=memberExpression.Compile().Invoke();/“火灾类型…”
}
私有字符串GetMemberName(表达式memberExpression)
{
var expressionBody=(MemberExpression)MemberExpression.Body;
返回expressionBody.Member.Name;
}
请注意,这只适用于“成员表达式”,即()=>变量、属性、字段;否则将抛出。据我所知,这是在C#中执行此操作的唯一方法。还请注意,可以将
params Expression[]
作为参数(然后Foo(()=>charizard,()=>pikachu,…);
我必须修改Foo方法的第二行,使其读取memberExpression.Compile().Invoke()
因为argumentExpression
不存在于该方法的范围内。这真的很令人印象深刻,我非常感谢你的回答速度。你能根据上面的内容更改你的答案吗?它可以工作,以防其他人来查看?@Imbaker1234修复。我需要解决一些相同的问题很久以前..顺便说一句,现在看看它,使用dictionary[“charizard”]=“fire type…”
等。对您不起作用吗?您可以直接将成对数据存储在字典中,然后像这样使用它们。这里有很多东西可以使用。我的目标是创建一种干净简洁的方法来跟踪对象,并在单元测试期间将其打印到控制台。这只是一个小优势,但软件开发是一种流动因此,现在如果我有6个变量要跟踪和打印,我可以简单地添加任何类型的对象,并且它可以工作。字典可以工作,但会更长。我当然知道你可以简单地调试,但当我在20个不同的版本上创建9个测试用例时
private Dictionary<string, object> Localvars = new Dictionary<string, object>();
public void InsertEntry(string objectName, object objectToAdd, string description)
{
Localvars.Add(objectName + $": {description}", objectToAdd);
}
public static void Main(string[] args)
{
var d = new Demo();
var charizard = "Fire type that looks like a dragon";
var blastoise = "Water type that resembles a turtle with cannon barrels sticking out of its shell";
var pikachu = "Electric type that resembles a cute electric rodent";
d.InsertEntry(nameof(charizard), charizard, "The first one");
d.InsertEntry(nameof(blastoise), blastoise, "The second one");
d.InsertEntry(nameof(pikachu), pikachu, "The third one");
d.PrintVars();
}
private Dictionary<string, object> Localvars = new Dictionary<string, object>();
public void InsertEntry(object objectToAdd, string description = "")
{
Localvars.Add(nameof(objectToAdd) + $": {description}", objectToAdd);
}
public void InsertEntry(params object[] objectToAdd)
{
Localvars.Add(nameof(objectToAdd), objectToAdd);
}
public static void Main(string[] args)
{
var d = new Demo();
var charizard = "Fire type that looks like a dragon";
var blastoise = "Water type that resembles a turtle with cannon barrels sticking out of its shell";
var pikachu = "Electric type that resembles a cute electric rodent";
// This is ideally how I'd like it to work
d.InsertEntry(charizard);
d.InsertEntry(blastoise);
d.InsertEntry(pikachu);
// Or this would be even better if the method could take params. I imagine it would be the same solution.
d.InsertEntry(charizard, pikachu, blastoise);
d.PrintVars();
}
var charizard = "fire type...";
Foo(() => charizard);
private void Foo<T>(Expression<Func<T>> memberExpression)
{
var memberName = GetMemberName(memberExpression); // "charizard"
var expressionValue = memberExpression.Compile().Invoke(); // "fire type..."
}
private string GetMemberName<T>(Expression<Func<T>> memberExpression)
{
var expressionBody = (MemberExpression)memberExpression.Body;
return expressionBody.Member.Name;
}