通过动态密钥名称获取属性?

时间:2017-02-10 04:42:51

标签: c# razor

我试图避免重复某些模板,假设我有以下(非常简化)模板:

<div class="same-template">
    @(button?.buttonLeft.Url)
</div>
<div class="same-template">
    @(button?.buttonRight.Url)
</div>

我也有一个按钮右模板,所以我的问题是,有没有办法可以通过按钮的“侧面”,并访问该属性?我知道在javascript中我会做类似的事情:

@(button?.button"+side+".Url)但显然我们没有使用javascript。

我尝试过创建辅助函数

@helper GetFooter(Object button, String side) {
    <div class="same-template">
        <!-- don't know what to do here... -->
        @(button?.button<side>.Url)
    </div>
}

@GetFooter(button, "Right")

我希望这很清楚!

修改    我已经完成了以下功能,但是在var b行上有一些失败,出现以下错误:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

@functions{

    public dynamic GetNestedDynamicValue(IContentCardItem cardItem, String first, String second) {
        var b = cardItem?.GetType().GetProperty(first).GetValue(cardItem, null);
        var c = b?.GetType().GetProperty(second).GetValue(b, null);
        return c;
    }
}

1 个答案:

答案 0 :(得分:1)

C#是键入的,不提供像JavaScript这样的功能。无论如何,你可以尝试类似下面的例子,通过名字来恐怖地阅读财产价值:

<div>
    @(button?.GetType().GetProperty("PropertyNameWhichYouNeed").GetValue(button, null))
</div>

更新:

好的,我认为你需要一些扩展方法,但首先尝试一下:

button?.GetType().GetProperty("buttonRight").GetValue(button, null)
    .GetType().GetProperty("Url").GetValue(
button?.GetType().GetProperty("buttonRight").GetValue(button, null),
 null);

它变得令人困惑:)我不喜欢这种UI,但试着解释一下:

我第一次检索buttonRight属性的类型。然后我检索类型Url并提供buttonRight实例的类型。

应该按以下几行划分:

var buttonRight = button.GetType().GetProperty("buttonRight").GetValue(button, null);
var url = buttonRight.GetType().GetProperty("Url").GetValue(buttonRight, null);

现在url是你看的价值。请看小提琴是如何工作的:

.NET Fiddle