编辑:为了清楚地说明我的问题,我问了一个新问题。
编辑:因为反射解决方案是不可能的,所以我把标题从"有没有办法在C#中获得变量名?"改为"如何在C#中使用反射来区分具有相同属性的类成员">
编辑:变量名称的含义并不准确,我的目标是
- 如果可能的话,使用反射获取变量名(有人已经告诉我这是不可能的(
- 在任何情况下(例如,在CheckMethod中(声明成员时,都可以使用解决方案来获取添加的信息
我想我可以使用Reflection来获取变量信息,包括它的名称,但它不起作用。
public class C
{
public List<string> M1{get; set;}
public List<string> M2{get; set;}
}
static void Main(string[] args)
{
C c = new C();
CheckMethod(c.M1);
ChekcMethod(c.M2);
}
void CheckMethod(List<string> m)
{
//Want to get the name "M1" or "M2", but don't know how
Console.Write(m.VariableName);
}
然后,我认为属性可能是解决方案。
public class C
{
[DisplayName("M1")]
public List<string> M1{get; set;}
[DisplayName("M2")]
public List<string> M2{get; set;}
}
static void Main(string[] args)
{
C c = new C();
CheckMethod(c.M1);
ChekcMethod(c.M2);
}
void CheckMethod(List<string> m)
{
//Find all properties with DisplayNameAttribute
var propertyInfos = typeof(C)
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.GetField | BindingFlags.GetProperty)
.FindAll(pi => pi.IsDefined(typeof(DisplayNameAttribute), true));
foreach (var propertyInfo in propertyInfos)
{
//I can get the DisplayName of all properties, but don't know m is M1 or M2
}
}
是否有任何本地反射方法可以获取变量的名称这是不可能的- 如何确定方法参数代表哪个成员变量
我正在使用Unity3D,所以.net版本是3.5
使用反射是不可能的。编译后,变量名称将不存在,因此不能在运行时使用反射来获取名称。还有一些其他方法,如表达式树和闭包。如果你能用的话,试试这个。
static string GetVariableName<T>(Expression<Func<T>> expr)
{
var body = (MemberExpression)expr.Body;
return body.Member.Name;
}
要使用这种功能,您可以执行
GetVariableName(() => someVar)
如果您使用的是C#,则添加了一个新名称keyworkd。更多信息
https://msdn.microsoft.com/en-us/magazine/dn802602.aspx
您可以使用nameof(anyVariable)
,它应该以字符串的形式返回任何变量的名称。