C# 在C中的方法中从模板获取类#
我需要在通用方法中传递C# 在C中的方法中从模板获取类#,c#,templates,generics,C#,Templates,Generics,我需要在通用方法中传递GridViewCommandEventArgs或GridViewRowEventArgs或int,并从中获取值 示例代码: public struct RemarkStruct { public string remarkId; public RemarkStruct(string _remarkId) { remarkId = _remarkId; } } public RemarkStruct GetRemarkDa
GridViewCommandEventArgs
或GridViewRowEventArgs
或int
,并从中获取值
示例代码:
public struct RemarkStruct
{
public string remarkId;
public RemarkStruct(string _remarkId)
{
remarkId = _remarkId;
}
}
public RemarkStruct GetRemarkData<T>(T val)
{
if (val is GridViewCommandEventArgs )
{
GridViewCommandEventArgs gvCommandArgs = (GridViewCommandEventArgs) val;
int rowIndex = GetRowIndex_CommandEvent((T) val);
//
GridViewRow row = ((GridViewRow)(((ImageButton)gvCommandArgs.CommandSource).NamingContainer));
remarkId = (row.FindControl("imgBtnDelete") as ImageButton).CommandArgument;
RemarkStruct remStruct = new RemarkStruct(remarkId);
return remStruct;
}
}
public结构RemarkStruct
{
公共字符串remarkId;
公共remarktract(字符串_remarkId)
{
remarkId=_remarkId;
}
}
公共remarktract GetRemarkData(T val)
{
if(val为GridViewCommandEventArgs)
{
GridViewCommandEventArgs gvCommandArgs=(GridViewCommandEventArgs)val;
int rowIndex=GetRowIndex_CommandEvent((T)val);
//
GridViewRow行=((GridViewRow)((ImageButton)gvCommandArgs.CommandSource.NamingContainer));
remarkId=(row.FindControl(“imgBtnDelete”)作为ImageButton);
RemarkStruct remStruct=新的RemarkStruct(remarkId);
返回remStruct;
}
}
我想从下面的方法调用
protected void gvRemark_RowCommand (object sender, GridViewCommandEventArgs e)
{
GetRemarkData<GridViewCommandEventArgs >(e);
}
protectedvoid gvRemark\u行命令(对象发送方,GridViewCommandEventArgs e)
{
GetRemarkData(e);
}
我刚刚为
GridViewCommandEventArgs
编写了代码,类似地,我想为GridViewRowEventArgs
和int编写代码。如果已经创建了泛型than,那么您也可以在泛型函数中传递其他类型。。您可以检查T的类型,然后根据它编写代码
例如:
public RemarkStruct GetRemarkData<T>(T val)
{
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
}
public remarktract GetRemarkData(T val)
{
if(typeof(T)=typeof(MyClass))
{
MyClass mc=(MyClass)(object)t;
}
否则如果(类型(T)=类型(列表))
{
列表lmc=(列表)(对象)t;
}
}
如果您创建了泛型than,则可以在泛型函数中传递其他类型。您可以检查T的类型,然后根据它编写代码
例如:
public RemarkStruct GetRemarkData<T>(T val)
{
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
}
public remarktract GetRemarkData(T val)
{
if(typeof(T)=typeof(MyClass))
{
MyClass mc=(MyClass)(object)t;
}
否则如果(类型(T)=类型(列表))
{
列表lmc=(列表)(对象)t;
}
}
您可以使用界面,类似这样的
using System;
public struct RemarkStruct
{
}
public interface IEventArgs
{
RemarkStruct GetRemarkData();
}
public class GridViewCommandEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
public class GridViewRowEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
protected void gvRemark_RowCommand (object sender, IEventArgs e)
{
e.GetRemarkData();
}
您的方法将如下所示
using System;
public struct RemarkStruct
{
}
public interface IEventArgs
{
RemarkStruct GetRemarkData();
}
public class GridViewCommandEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
public class GridViewRowEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
protected void gvRemark_RowCommand (object sender, IEventArgs e)
{
e.GetRemarkData();
}
我不知道这是否是最优雅的方法,但您可以重写此方法以获取int作为参数
protected void gvRemark_RowCommand (object sender, int e)
{
//...
}
你可以使用界面,像这样的
using System;
public struct RemarkStruct
{
}
public interface IEventArgs
{
RemarkStruct GetRemarkData();
}
public class GridViewCommandEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
public class GridViewRowEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
protected void gvRemark_RowCommand (object sender, IEventArgs e)
{
e.GetRemarkData();
}
您的方法将如下所示
using System;
public struct RemarkStruct
{
}
public interface IEventArgs
{
RemarkStruct GetRemarkData();
}
public class GridViewCommandEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
public class GridViewRowEventArgs : EventArgs, IEventArgs
{
public RemarkStruct GetRemarkData()
{
throw new NotImplementedException();
}
}
protected void gvRemark_RowCommand (object sender, IEventArgs e)
{
e.GetRemarkData();
}
我不知道这是否是最优雅的方法,但您可以重写此方法以获取int作为参数
protected void gvRemark_RowCommand (object sender, int e)
{
//...
}
我认为你应该重新考虑你的泛型方法,因为泛型方法通常意味着你可以使用任何类型,而不仅仅是三种或四种。否则,您必须注意许多不同的验证检查。您可以创建一个接口,所有三种不同的实现都可以实现该接口,因此您的方法的实际功能更加清晰。@HimBromBeere谢谢。实际上,我需要使用更多的类型,但现在我已经提到了其中的3种,以便使我的问题尽可能小。我在这些事情上绝对是个笨蛋。所以请容忍我。我可能有点恼火,但最后我想学点东西。你能举例说明你说的话吗。很抱歉占用您的时间,谢谢您的想法。我认为您应该重新考虑您的通用方法,因为通用方法通常意味着您可以使用任何类型,而不仅仅是三种或四种。否则,您必须注意许多不同的验证检查。您可以创建一个接口,所有三种不同的实现都可以实现该接口,因此您的方法的实际功能更加清晰。@HimBromBeere谢谢。实际上,我需要使用更多的类型,但现在我已经提到了其中的3种,以便使我的问题尽可能小。我在这些事情上绝对是个笨蛋。所以请容忍我。我可能有点恼火,但最后我想学点东西。你能举例说明你说的话吗。很抱歉占用您的时间,谢谢您的想法。谢谢您的回复。你救了我一天。我还有一个问题。请告诉我如何限制特定类型的泛型。就像我只想限制他使用GridViewCommandEventArgs一样,GridViewRowEventArgs和int。这正是我要找的。@MuhammedAli-对于限制类型,您可以检查泛型约束:在您的情况下,它可能会有部分帮助,因为您希望允许int,对于其他两种类型,您可以轻松定义约束……由于int是值类型,您需要另一个带有constantHanks的方法来回答。你救了我一天。我还有一个问题。请告诉我如何限制特定类型的泛型。就像我只想限制他使用GridViewCommandEventArgs一样,GridViewRowEventArgs和int。这正是我要找的。@MuhammedAli-对于限制类型,您可以检查泛型约束:在您的情况下,它可能会有部分帮助,因为您希望允许int,对于其他两种类型,您可以轻松定义约束……由于int是值类型,您需要另一种具有constantHanks的方法。我喜欢学习,你帮了我很多。我怀疑你是否能回答。我们可以将这些事件用作课堂吗??因为这些是asp.net的GridView事件。抱歉,没有疑问。事件不能用作类。但是EventArgs是一个类,GridViewRowEventArgs和GridViewCommandEventArgs也应该继承EventArgs。我编辑了我的帖子。希望这能奏效,谢谢你的回复。我非常感谢你。请再澄清一个可能的疑问。可以激发Can受保护的void gvRemark_RowCommand(对象发送方,IEventArgs e)方法,而不是受保护的void gvRemark_RowCommand(对象发送方,GridViewCommandEventArgs e)。我觉得我很烦人,但我想用这种方法工作,因为我觉得这种学习提高了我的兴趣。请再说一遍。在EventHandler中,您将指向此方法gvRemark\u row命令,以便触发此方法,并在IEventArgs的位置放置任何实现IEventArgs和本例EventArgs的类。我希望这就是你的要求。谢谢