Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中的方法中从模板获取类#_C#_Templates_Generics - Fatal编程技术网

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的类。我希望这就是你的要求。谢谢