c# - 从属性类型中获取属性名称
问题描述
我无法弄清楚如何更好地制定标题。我看到很多标题相似但讨论完全不同的东西的帖子。
所以我们开始吧。实际的地面情况很复杂,但我将尝试发布一个绝对简约的示例来描述它。
假设我们有一个名为的类Animal
:
class Animal
{
public void Run()
{
try
{
//try running
}
catch(Exception e)
{
MessageBox.Show(this.SomeCleverWayOfGettingPropertyName() + " failed to run");
}
}
}
Animal
现在我在另一个类中定义了几个类型的属性:
class Zoo
{
public Animal Zebra {get; set;}
public Animal Lion {get; set;}
public Animal Rhino {get; set;}
public void RunAll()
{
Zebra.Run();
Lion.Run();
Rhino.Run();
}
}
我要写什么来代替SomeCleverWayOfGettingPropertyName()
它显示动物的名称(即声明的属性的名称),例如“斑马无法运行”。
正如我所说,实际情况更复杂,所以请避免回答“为什么不重新设计整个代码库,而是尝试 X”之类的答案。我希望找到一些东西 System.Reflection
来找出主叫成员的名字,但我还没有找到类似的东西。
解决方案
理想情况下,你会重新考虑你的问题,并可能在跑步之外抓住
根据您的确切需求,表达式可能会起作用。但是,这确实是一个糟糕的解决方案,如果您竭尽全力,不妨在外面赶上,或者只是将成员名称传递进去。
给定
public class Animal
{
public void Run()
{
Console.WriteLine("Running");
}
}
public static class MemberInfoGetting
{
public static void Run<T>(this Expression<Func<T>> memberExpression) where T : Animal
{
var expressionBody = (MemberExpression)memberExpression.Body;
try
{
var animal = Expression.Lambda<Func<Animal>>(expressionBody).Compile()();
animal.Run();
throw new Exception("bob");
}
catch
{
Console.WriteLine($"{expressionBody.Member.Name} : failed to run");
}
}
}
用法
public static Animal Rhino { get; set; } = new Animal();
public static void Main()
{
MemberInfoGetting.Run(() => Rhino);
}
输出
Running
Rhino : failed to run
推荐阅读
- reactjs - React-Admin:在列表中显示之前映射资源数据
- html - Bootstrap 汉堡菜单改变位置
- json - 使用动态字段 json 快速发送请求
- php - 超过 60 秒的最大执行时间
- bash - 分配多行 shell 变量,包括带有嵌入空格和引号的文件作为 rsync 命令的参数
- jenkins - 在 Jenkins 中找不到全局 Slack 通知程序 如何仅使用 Slack
- mysql - Solr DataImportHandler 使用 MySQL 作为源 - 处理 json 类型列
- android - android 10:调用downloadmanager时android.process.media不断停止
- arrays - TypeScript 数组 find() 方法说,“没有重载匹配这个调用”
- opengl - glGetProgramiv 末尾的后缀是什么意思?