2017-02-10 121 views
1

我是一個大菜鳥好了,請與我裸...通過動態密鑰名稱獲取屬性?

基本上,我試圖避免重複一些模板,比方說,我有以下的(非常簡化的)模板:

<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; 
    } 
} 
+0

那麼,你想要在頁面中呈現按鈕的屬性值?你想通過字符串名稱訪問該屬性? – kat1330

+0

不支持您想要訪問該屬性的方式。你可以做的是檢查if子句中'side'的值,並根據該值使用按鈕的適當屬性。 –

回答

1

C#的類型並沒有提供的功能像JavaScript一樣。無論如何,你可以嘗試一些像follwoing例如通過名稱dinamically讀取的屬性值:

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

UPDATE:

好吧,我認爲你會需要一些擴展方法,但首先嚐試這樣的:

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

+0

謝謝你,這與我試過的類似,我完全省略了部分代碼,我將如何訪問'button?.buttonLeft?.Text',其中Left仍然是關鍵的動態部分,但Text是不變的? –

+0

我已更新我的問題 –

+0

謝謝你,最後一件事!我已經編輯我的OP再次與我的最後一個問題 –