如何创建一个返回条件类型的方法

时间:2012-05-06 08:00:22

标签: c#

如果我的pictureboxstupic包含图像,我在我的一个项目中有一个如下方法,它返回byte []。 虽然我想以这样的方式转换它,如果pictureboxstupic中没有图片,它应该返回string =“NULL”否则它应该返回bute []。 我怎么能这样做?

private byte[] GetPic()
{
    using (var stream = new MemoryStream())
    {
        var bmp = new Bitmap(pictureboxstupic.Image);
        bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        stream.Position = 0;
        var data = new byte[stream.Length];
        stream.Read(data, 0, data.Length);
        return data;
    }
}

注意: 我插入图像的列如下

CREATE TABLE [dbo].[Students] 
([Photo] [image] NULL)

并且在我目前的情况下我将图像插入上面提到的列中,即Students.Photo就像这样

if (pictureboxstupic.Image == null)
{
    cmd.Parameters.Add("@Photo", SqlDbType.VarChar).Value = "NULL";
}
else
{
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic();
}

6 个答案:

答案 0 :(得分:4)

您可以随时返回对象并将其转换为您期望的类型 - 但这不是一个好主意。如果在调用方法之前检查pictureboxstupic是否为空,然后执行正确的逻辑(例如,指定“NULL”),那会更好。

您也可以对TryParse应用类似的语义 - 也就是说,如果pictureboxstupic不为空,您可以返回bool,并将字节数组作为out参数返回。

答案 1 :(得分:3)

@ empi的回答是正确的,我想扩展它: 方法和功能应该有一套严格定义的职责。对于GetPic方法,可以获取图片的字节流。这应该是该方法中封装的逻辑程度。

显示单词" NULL"在某些错误框中,不是 GetPic的责任。它负责任何人调用它并负责显示图像或错误消息。这就是为什么我认为GetPic应该返回null如果它是一个合理的条件来接收没有图像,或者如果它是一个真正的错误条件,甚至可能会抛出异常打破了程序流程。

在任何情况下,您不应做的是返回object,可以是byte[]string,因为这样会打败整个强类型环境的一个点,是以后引入错误的好方法。如果您必须返回byte[]string,则可以按其他人的建议使用ref/out参数,也可以创建一个名为ImageData的新类,或者其他,它包含字节和错误消息,您可以使用它们来检索其中一个或另一个。

- 编辑

在澄清之后,我仍然坚持我的回答。你不应该这样做。数据库支持的NULL值与字符串" NULL"相同。您应该确保列可以为空,并插入空值 - DBNull.Value,而不是插入此字符串。您当前的代码将崩溃,因为Photo列无法处理VarChar值。

答案 2 :(得分:1)

返回object而不是?然后使用is关键字首先检查类型。

if(returnedType is string) //or use as and then check for NULL
{

}
else   //type is byte[]
{
}

不确定您的用例以及它是否有效,但这可以是一个解决方案

答案 3 :(得分:1)

您可以通过三种解决方案来实现:

1。)使用对象作为返回类型

2。)使用'ref'和'out'参数说明符返回数组和make方法返回类型字符串以返回状态消息。

3。)对指针使用'unsafe'代码......

示例:

    public string GetPic(out byte[] ret)
    {
        if (Image == null)
            return "NULL";
        //set ret's value as image bytes
        return "ok";
    }

答案 4 :(得分:0)

你可以这样做:

        //call the method:
        string str = ""; //variable that will be changed accordingly by returned value
        byte[] image = GetPic();
        if (image.Length == 0)
        {
            //do what ever you want, like string = "NULL":
            str = "NULL";
        }
    //
    //

    private byte[] GetPic()
    {
        PictureBox pictureboxstupic = new PictureBox();
        using (var stream = new MemoryStream())
        {
            var bmp = new Bitmap(pictureboxstupic.Image);
            bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            stream.Position = 0;
            var data = new byte[stream.Length];
            stream.Read(data, 0, data.Length);
            return data;
        }
    }

答案 5 :(得分:-1)

我这样解决了我的问题 方法:

private object GetPic()
{
    if(pictureboxstupic.Image == null)
    {
        return null;
    }
    using (var stream = new MemoryStream())
    {
        var bmp = new Bitmap(pictureboxstupic.Image);
        bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        stream.Position = 0;
        var data = new byte[stream.Length];
        stream.Read(data, 0, data.Length);
        return data;

    }
}

用法:

cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic() ?? DBNull.Value;