泛型方法的问题

sheyouyou1 2008-11-16 11:49:19
泛型对象的方法应该怎么处理
如果我要这样的泛型方法
public void SayPlay<T, S>(T t, S s)
{
t.SHOW(s); //可接受类型"T"没有SHOW()方法
}

在调用该方法的时候给该方法的参数是有SHOW方法的。但编译通不过,这样的泛型方法要怎么写呢。
...全文
1283 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦回自己 2011-09-30
  • 打赏
  • 举报
回复
学习中
sheyouyou1 2008-11-17
  • 打赏
  • 举报
回复
谢谢 gameboxer 我觉得泛型和反射组合非常不错
wuyq11 2008-11-16
  • 打赏
  • 举报
回复
参考
http://blog.csdn.net/fengsky491/archive/2008/04/07/2256414.aspx
http://www.cnblogs.com/zhuawang/archive/2007/04/13/711921.html
mjjzg 2008-11-16
  • 打赏
  • 举报
回复
1楼的就可以了
slimfeng 2008-11-16
  • 打赏
  • 举报
回复
学习!平时很少用泛型
qinhl99 2008-11-16
  • 打赏
  • 举报
回复
泛型约束简介

C#泛型要求对"所有泛型类型或泛型方法的类型参数"的任何假定,都要基于"显式的约束",以维护C#所要求的类型安全.

"显式约束"有where字句表达,可以指定"基类约束","接口约束","构造器约束","值类型/引用类型约束"共四中约束.

"显示约束"并非必须,如果没有指定"显式约束",泛型类型参数将只能访问System.Object类型中的公有方法.

基类约束

class A
{
public void F1(){}
}
class B
{
public void F2(){}
}

class C(S,T)
where S:A // S继承自A
where T:B // T继承自B
{
// 可以在类型为S的变量上调用F1
// 可以在类型为T的变量上调用F2
}

接口约束

interface IPrintable{coid Print();}
interface IComparable<T>{int CompareTo(T v);}
interface IKeyProvider<T>{T HetKey();}

class Dictionary<K,V>
where K:IComparable<K>
where V:IPrintable,IKeyProvider<K>
{
// 可以在类型为K的变量上调用CompareTo
// 可以在类型为V的变量上调用Print和GetKey
}

qinhl99 2008-11-16
  • 打赏
  • 举报
回复
这个就需要范型方法的约束来解决了!
具体的说,就得这样:先定义一个定义了Show方法的接口,比如IShow;
然后类似于这样:
public void SayPlay <T, S>(T t, S s) where class,IShow<T>,new()
{
t.SHOW(s); //可接受类型"T"没有SHOW()方法
}
只是给你个样子,不一定写的没错,但思路就这样!
Fibona 2008-11-16
  • 打赏
  • 举报
回复
加上泛型约束

List<T> where T : IuserFace这样让T必须实现IuserFace接口,接口时面有一方法Show();

详细情况查MSDN
孙晓军82 2008-11-16
  • 打赏
  • 举报
回复
反射可以在程序加载后动态的对类型内部的数据或成员的地址(类型元数据)直接执行操作。
即只要该类型被加载了,你就可以用反射存取它的成员(包括公有的和私有的,实例的和静态的)。

//就是先得到它的类型了。
Type type = t.GetType();
//获取此类型下的方法。参数一是方法名,参数二指定了,只取公有并且是实例的方法。
MethodInfo mi = type.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance);
//触发方法,参数一是此方法所在的实例(如果是静态方法传null),参数二是此方法的参数组。
mi.Invoke(t, new object[] {s} );

其实对于你的例子直接调用
type.InvokeMember("Show", BindingFlags.Public | BindingFlags.Instance, null, t, new object[] {s} );
就可以了。
sheyouyou1 2008-11-16
  • 打赏
  • 举报
回复
反射真是个好东西,虽然还没很理解。呵呵,谢谢各位特别感谢gameboxer,结贴去
xu_2007 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sheyouyou1 的回复:]
引用 8 楼 gameboxer 的回复:
如果我使用该泛型方法的参数对象的类不允许我编辑要怎么办

public void SayPlay <T,S>(T t,S s)
{
Type type = t.GetType();
MethodInfo mi = type.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance);
mi.Invoke(t, new object[] {s} );
}


非常感谢 有效 但不怎么理解还在研究中,gameboxer兄弟能介绍下这段代码的意思吗
[/Quote]


好代码!
sheyouyou1 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gameboxer 的回复:]
如果我使用该泛型方法的参数对象的类不允许我编辑要怎么办

public void SayPlay <T,S>(T t,S s)
{
Type type = t.GetType();
MethodInfo mi = type.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance);
mi.Invoke(t, new object[] {s} );
}
[/Quote]

非常感谢 有效 但不怎么理解还在研究中,gameboxer兄弟能介绍下这段代码的意思吗
sheyouyou1 2008-11-16
  • 打赏
  • 举报
回复
哦 在 System.Reflection空间 还在研究
happychou 2008-11-16
  • 打赏
  • 举报
回复
学习了。。。
sheyouyou1 2008-11-16
  • 打赏
  • 举报
回复
楼上的兄弟 MethodInfo 是什么
孙晓军82 2008-11-16
  • 打赏
  • 举报
回复
如果我使用该泛型方法的参数对象的类不允许我编辑要怎么办

public void SayPlay <T,S>(T t,S s)
{
Type type = t.GetType();
MethodInfo mi = type.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance);
mi.Invoke(t, new object[] {s} );
}
sheyouyou1 2008-11-16
  • 打赏
  • 举报
回复
谢谢各位现在对泛型有点了解了,下面是我根据各位的提示写的例子,但还有点疑问
namespace Zhnet
{
class Program
{
static void Main()
{
Class1 class1 = new Class1();
S_Class s = new S_Class();
T_Class t = new T_Class();
class1.SayPlay <T_Class ,S_Class >(t,s); //泛型方法
t.Show(s); //实例方法
Console.ReadLine();
}
}
//定义一个接口
public interface Iddfd<S>
{
void Show(S s);
}
public class Class1
{

public void SayPlay<T,S>(T t,S s) where T :Iddfd<S>
{
t.Show(s);
}
}
public class S_Class
{

public S_Class()
{
name = "中国人";
}
public string name { get; set; }
}
///************************************************************
//我是不是必须在类的定义这里写继承与该接口,如果该类是我不能修改的怎么办
///************************************************************
public class T_Class : Iddfd<S_Class>
{
public void Show(S_Class s)
{
Console.WriteLine(s.name );
}
}
}

如果我使用该泛型方法的参数对象的类不允许我编辑要怎么办

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧