c# – 使用动态确定的类类型静态定义成员
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用动态确定的类类型静态定义成员,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3402字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用动态确定的类类型静态定义成员](/upload/InfoBanner/zyjiaocheng/808/9015777c0d874381b51c762b781fc999.jpg)
我正在尝试创建一个事件委托,其中参数强类型以匹配当前类,如下所示:
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public event RequestCompleteHandler RequestComplete;
问题是这个类的要点是继承,我真正想要的是所有那些继承类的人都有“RequestComplete”事件,其中为该类输入了委托:
public class HPCGetConfig : HPCRequest
{
//I want this class to effectively inherit something like this:
//public delegate void RequestCompleteHandler(HPCGetConfig request);
这是因为目前,当我有一个处理我的“RequestComplete”事件之一的函数时,我目前必须这样做:
myGetConfigRequest.RequestComplete += new HPCRequest.RequestCompleteHandler(HPCGetExpectedLosses_RequestComplete);
void HPCGetConfig_RequestComplete(HPCRequest request)
{
HPCGetConfig thisRequest = request as HPCGetConfig;
//This should be strongly typed in the first place.
但我希望能够做到这样的事情:
request.RequestComplete += new HPCGetConfig.RequestCompleteHandler(HPCGetConfig_RequestComplete);
request.SendRequestAsync();
}
void HPCGetConfig_RequestComplete(HPCGetConfig request)
{
request.RequestComplete -= HPCGetConfig_RequestComplete;
尝试
我试过这个:
public delegate void RequestCompleteHandler<T>(T request) where T : HPCRequest;
public event RequestCompleteHandler<T> RequestComplete;
但是当我尝试使用RequestComplete(this);从基类中调用事件时,我得到一个编译时错误:`Delegate’RequestCompleteHandler’有一些无效的参数.
无论我是否将整个HPCRequest类设置为HPCRequest< T>,都会发生这种情况.去:
public class HPCRequest<T> where T : HPCRequest<T>
{
public delegate void RequestCompleteHandler<T>(T request);
public event RequestCompleteHandler<T> RequestComplete;
public class HPCGetConfig : HPCRequest<HPCGetConfig> { ...
当我尝试调用事件时发生同样的错误:RequestComplete(this);
我还尝试了所有形式的创建委托和事件并覆盖它们,例如:
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public virtual event RequestCompleteHandler RequestComplete;
public sealed class HPCGetConfig : HPCRequest
{
public delegate void RequestCompleteHandler(HPCGetConfig request);
public override event RequestCompleteHandler RequestComplete;
但这给了我一个编译时错误,因为我不能用不同的委托类型之一覆盖RequestComplete事件.
还有其他想法吗?
编辑
模仿整个HPCRequest类是不可取的,经过一次非常彻底的尝试,我发现它只是搞砸了每次尝试使用HPCRequest类型作为任何请求类型的占位符.如果此解决方案能够正常工作,则必须能够实例化并继承HPCRequest类,而无需指定类型参数.我需要一个不需要模板HPCRequest的解决方案.
为了确保每个人都确切地知道我是如何使用它的,我将一些示例代码粘贴到pastebin中,这可以让您尝试使这个事件模板化工作的方式而不会破坏任何东西.这是:http://pastebin.com/bbEYgLj1
解决方法:
你可以试试的:
public abstract class HPCRequest<T> where T : HPCRequest<T>
{
public delegate void RequestCompleteHandler(T request);
public event RequestCompleteHandler RequestComplete;
protected void RaiseRequestComplete(T request)
{
if (RequestComplete != null)
{
RequestComplete(request);
}
}
}
public class Foo : HPCRequest<Foo>
{
public void Bar()
{
RaiseRequestComplete(this);
}
}
public class Example
{
public static void Test()
{
var request = new Foo();
request.RequestComplete += RequestComplete;
}
static void RequestComplete(Foo request)
{
// It's a Foo!
}
}
这种自引用泛型约束允许我想要的内容.我添加了受保护的RaiseRequestCompleted,因此您仍然可以从继承自HCPRequest的类中引发事件.否则,只允许HCPRequest这样做.
更新:我更新了代码以传递此信息并添加了与您所需结果匹配的示例代码.
内容总结
以上是互联网集市为您收集整理的c# – 使用动态确定的类类型静态定义成员全部内容,希望文章能够帮你解决c# – 使用动态确定的类类型静态定义成员所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。