C# 在泛型类中调用方法

标签 c# .net generics casting

我正在从 EmguCV 扩展 ImageBox 控件。控件的 Image属性可以设置为任何实现 IImage 的东西界面。

以下所有实现此接口(interface):

Image<Bgr, Byte>
Image<Ycc, Byte>
Image<Hsv, Byte>

现在我想调用Draw上述类型的对象上的方法(无论它可能是什么)。

问题是当我访问 Image 属性时,返回类型是 IImage . IImage 没有实现 Draw方法,但以上所有方法都可以。

我相信我可以转换类型为 IImage 的对象到上面的其中一个(右边的那个),我可以访问 Draw方法。但是我怎么知道什么是正确的呢?如果您有更好的方法,也请提出建议。

编辑

抱歉,我忘了提一条重要信息。上述每个类的 Draw 方法都有一个不同的参数。例如Draw对于 Image<Bgr, Byte>采用 Bgr 类型的参数和 Draw对于 Image<Hsv, Byte>采用 Hsv 类型的参数相反。

最佳答案

添加一个继承自 IImage 的 IDrawableImage。

public interface IDrawableImage : IImage
{
   void Draw(object val);
   void Draw();
}

然后您可以简单地执行以下操作:

var drawableImage = container.Image as IDrawableImage;
if (drawableImage != null)
    drawableImage.Draw();

为了符合您上面的说明:

public interface IDrawableImage<T, B> : IDrawableImage where B : byte
{
    void Draw<T>(T val);
}

那么如果你知道类型:

var value = new Hvr();
var drawableImage = container.Image as IDrawableImage<Hvr, Byte>;
if (drawableImage != null)
    drawableImage.Draw(value);

如果你不这样做

var value = new Hvr();
var drawableImage = container.Image as IDrawableImage;
if (drawableImage != null)
    drawableImage.Draw(value);

关于C# 在泛型类中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443593/

相关文章:

c# - 获取winforms文本框的光标位置

.net - 如何使用 dotnet CLI(命令行)将项目 (.csproj) 添加到解决方案文件夹下的解决方案 (.sln)?

c# - 通用列表替换

.net - 我可以将 Azure 移动服务与 Unity 3d 结合使用吗?

SwiftUI - 我可以为通用 View 定义一个空的初始值设定项吗?

Django 教程。通用 View 。 context_object_name = 'latest_question_list'

c# - 扩展 asp.net 身份 OWIN 身份验证框架以使用 Amazon DynamoDb

C# .net 3.5+ Dictionary<string, string> 键/值对显示值作为默认选择 – MVC 选择列表

c# - Azure 服务总线连接字符串导致 CloudStorageAccount.Parse 错误

c# - StringBuilder 的 GetHashCode 生成不同的代码