Подсказки:
Вам нужно передать System.Type вашему методу ...
Вам нужно будет использовать Object.GetType (), а также оператор typeof. Вы также можете создать экземпляр класса Type , используя его квалифицированное имя, если оно находится в выполняющейся сборке ИЛИ AssemblyQualifiedName
Основная идея ниже:
WebForm
<h2>Passing Types</h2>
<asp:Panel runat="server" ID="pnl1">
<p>
<asp:TextBox runat="server" ID="txt1" />
</p>
<p>
<asp:DropDownList runat="server" ID="ddl1" />
</p>
<p>
<asp:HyperLink runat="server" ID="hl1" Text="Link1" NavigateUrl="http://www.google.co.uk" Target="_blank" />
</p>
</div>
<asp:Label runat="server" ID="lout" />
<div>
<p>
<asp:DropDownList runat="server" ID="ddlTypes">
</asp:DropDownList>
<asp:Button runat="server" ID="btnGetValueFromType" Text="Get Value By Control Type" onclick="btnGetValueFromType_Click" />
</p>
</asp:Panel>
CodeBehind
( Извинения, это было довольно давно, так как я сделал любой VB.net , поэтому этот пример находится в C # )
protected void Page_Load(object sender, EventArgs e)
{
if (! IsPostBack){
buildGui();
}
}
private void buildGui(){
List<string> lstStrings = new List<string>(5);
lstStrings.Add("one");
lstStrings.Add("two");
lstStrings.Add("three");
lstStrings.Add("four");
lstStrings.Add("five");
ddl1.DataSource = lstStrings;
ddl1.DataBind();
//Populate the Types Dropdown with some fullyqualified type names (includes the assembly name,version number, PublicKey etc.)
Dictionary<string, string> lstTypes = new Dictionary<string, string>(3);
lstTypes.Add(this.ddl1.GetType().Name, this.ddl1.GetType().AssemblyQualifiedName);
lstTypes.Add(this.txt1.GetType().Name, this.txt1.GetType().AssemblyQualifiedName);
lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName);
//lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName);
lstTypes.Add(this.CRJunk01.GetType().Name, this.CRJunk01.GetType().AssemblyQualifiedName);
ddlTypes.DataSource = lstTypes;
ddlTypes.DataValueField = "value";
ddlTypes.DataTextField = "key";
ddlTypes.DataBind();
}
protected void btnGetValueFromType_Click(object sender, EventArgs e)
{
Type t = Type.GetType(ddlTypes.SelectedValue);
lout.Text = "Looking for a type: " + t.ToString();
foreach(Control c in this.pnl1.Controls){
if (c.GetType().Equals(Type.GetType(ddlTypes.SelectedValue)))//Look for controls whose type is the same as the type selected in ddl1.
{
lout.Text += string.Format("<br/>Got Control of type: {0}", c.GetType().Name);
//Cast to your custom Interface/BaseClass and extract the value.
lout.Text += "<br/>Value is: " + ((ICrJunkControl)(c)).ControlValue;
}
}
}
Это то, что вам, вероятно, понадобится, чтобы «использовать».
В заключение, вероятно, будет лучше, если все ваши пользовательские элементы управления наследуются от базового класса или интерфейса. Таким образом, когда вы нашли нужный объект на основе его типа, вы можете привести его к интерфейсу или базовому классу, а затем получить значение индивидуального общего члена, например, ControlValue
. Реализация ваших базовых классов переопределит это. Это поможет преодолеть проблемы, связанные с разрозненными элементами управления, имеющими разных членов, которые выставляют свое состояние.
например.
Текстовое поле -> Текст
DropdownList -> SelectedValue
Гиперссылка -> Текст / NavigateUrl
НТН,