首页 > 解决方案 > C# 属性传递将分配给计算值的属性名称

问题描述

我创建了一个从 XML 节点解析值的辅助方法,但此时我必须将属性名称传递给必须分配的值。

我知道该[CallerMemberName]属性,但我想知道是否有一个属性可用于自动获取将分配值的属性名称。

例如:

现在的情况

我有这个扩展方法:

public static string GetStringValueOrDefault(this XmlNode node, string elementName) =>
    node[elementName]?.InnerText ?? default;

像这样称呼它:

PrinterSettings.PrinterName = printerSettingsElement.GetStringValueOrDefault(nameof(PrinterSettings.PrinterName))

期望的情况

相同的扩展方法,带有一个属性:

public static string GetStringValueOrDefault(this XmlNode node, [AssigneeName] string elementName) =>
    node[elementName]?.InnerText ?? default;

我编了这个[AssigneeName]属性,但我想你明白了。

应该这样调用,这样更干净:

PrinterSettings.PrinterName = printerSettingsElement.GetStringValueOrDefault()

标签: c#

解决方案


TL;DR:没有。

而且一般情况下是不可能的。如果它只在某些情况下有效,那么AssigneeNameAtttribute当没有分配属性时假设会做什么?

考虑:

var temp = doc.GetStringValueOrDefault();
outputDoc.Prop = temp;

不仅对参数值temp没有帮助,它很可能被优化器删除,导致不同的行为取决于编译设置。elementNameGetStringValueOrDefault

CallerMemberNameAttribute- 总是有一个调用者不同 - 受让人可能不存在任何有用的格式。考虑另一种情况:

var results = doc.Elements()
                  .Select(e => new { e.Name, Value = e.GetStringValueOrDefault())
                  .ToList();

推荐阅读