Вам нужно использовать отражение, чтобы начать использовать метод, а затем «построить» его, предоставив аргументы типа MakeGenericMethod :
MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
. Для статического метода, pass null
в качестве первого аргумента Invoke
. Это не имеет никакого отношения к универсальным методам - это просто нормальное отражение.
Как уже отмечалось, многое из этого проще с C # 4 с использованием dynamic
- если вы можете использовать вывод типа, конечно. Это не помогает в случаях, когда вывод типа недоступен, например, точный пример в вопросе.
При использовании runat =, "сервер" наклеивает ЛЮБОЙ элемент, такой как DIV, он представит тот код как отдельное метод на скомпилированной странице.
при преобразовании кода 'прежней версии', это - хорошая идея удалить все право тегов runat впереди иначе, Вы заканчиваете в ситуации, где код как следующее дает Вам ошибку.
<% foreach (var cat in cats) { %>
<div runat="server">
<span class="name"> <%= cat.name %> </span> is a
<span class="breed"> <%= cat.breed %> </span>
</div>
<% } %>
Этот код приведет сообщение к сбою Вам некоторое сумасшествие приблизительно 'cat'
являющиеся из объема. В конечном счете при рассмотрении полного сгенерированного кода, Вы будете видеть, что эти <div>
был сгенерирован как его целый собственный метод - который является, конечно, другим объемом без кошек в поле зрения.
Назад в течение секунды к шаблону по умолчанию для приложения MVC:
Вы будете видеть, что текущий шаблон дает Вам это для head
:
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><%= Html.Encode(ViewData["Title"]) %></title>
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
</head>
Это оставило меня удивлением - если мы используем < % = синтаксис для записи заголовка непосредственно в эти title
тег - затем, почему мы должны были бы сделать это runat?
Это складывается, поскольку я подозревал, что codebehind для head
ищет существующее значение в теге заголовка (который был бы произведен здесь <%= Html.Encode(ViewData["Title"]) %>
. Если это найдет один (который будет иметь место для всех демонстрационных представлений в шаблоне MVC), затем, то это ничего не сделает далее. Если никакой заголовок не будет существовать (если ViewData ["Заголовок"] будет пустым или пустым), то он примет значение по умолчанию к тому, что определяется в Вашем представлении эти Title
атрибут:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/RRMaster.Master"
Title="View Products" AutoEventWireup="true" CodeBehind="ViewProduct.aspx.cs"
Inherits="RR_MVC.Views.Products.ViewProduct" %>
На моей основной странице я удалил бы эти runat='server'
тег - так как я не думаю, что буду когда-либо хотеть заполнить свое название страницы от представления Title
свойство. Но я удерживаю выполнение обещанного сообщения в блоге этого незаконченного Phil на предмете - в случае, если runat сервер дает мне что-либо полезное для моего CSS и JS также.
Они не означают, что Вы не можете использовать runat = "сервер", а скорее что это не необходимый для использования средств управления серверной стороны, обычно, в MVC. Если Вы находите, что нуждаетесь в управлении серверной стороны и работаете с ним в коде - позади это и признак, что приложение склоняется назад к веб-формам. Весь материал, который обычно происходил бы в Вашем коде - позади shoulo теперь быть обработанным в Вашем контроллере или в самой логике представления.
Просто читайте в этом учебном руководстве:
http://www.asp.net/learn/mvc/tutorial-12-cs.aspx
, что Вам нужно
<head runat="server">
, чтобы смочь легко определить название страницы в Ваших представлениях.