设置各种类型的传递参数的值c#

时间:2016-09-14 08:23:55

标签: c# asp.net-mvc httprequest

我正在尝试创建一个通用图片上传功能,所以我可以将它用于包含FileContent,FileName和FileType的不同属性名称的不同类。

这是我到目前为止所尝试的,但显然这不起作用,因为它没有设置传递参数的值。

public static void StoreFile(this HttpRequestBase @this, byte[] fileContent, string fileName, string fileType)
    {
        if ((@this.Files != null) && (@this.Files.Count == 1))
        {
            var file = @this.Files[0];
            if ((file != null) && (file.ContentLength > 0))
            {
                var content = new byte[file.ContentLength];
                file.InputStream.Read(content, 0, file.ContentLength);
                fileContent = content;
                fileName = file.FileName;
                fileType = file.ContentType;
            }
        }
    }

有没有办法传递匿名类型或在这种情况下有用的东西?

2 个答案:

答案 0 :(得分:1)

我相信您的解决方案是将您的函数声明更改为如下所示:

public static void StoreFile(this HttpRequestBase @this,ref byte[] fileContent, ref string fileName, ref string fileType)

请参阅ThePerplexedOne的评论(or this),了解其原因。

答案 1 :(得分:0)

以下是使用Action Delegates实现此目的的方法:

这是您的通用StoreFile方法,它将3个不同的操作代理作为参数。

public static void StoreFile<T>(this HttpRequestBase @this, T specificClassObject, Action<T, byte[]> setFileContent, Action<T, string> setFileName, Action<T, string> setFileType) where T : class
{
    if ((@this.Files != null) && (@this.Files.Count == 1))
    {
        var file = @this.Files[0];
        if ((file != null) && (file.ContentLength > 0))
        {
            var content = new byte[file.ContentLength];
            file.InputStream.Read(content, 0, file.ContentLength);
            setFileContent(specificClassObject, content);
            setFileName(specificClassObject, file.FileName);
            setFileType(specificClassObject, file.ContentType);
        }
    }
}

这就是为不同类型的对象调用StoreFile泛型方法的方法:

// SpecificClass has properties byte[] PDFFileContent, string MyOrYourFileName and string ContentTypeWhatEver
myHttpRequestBaseObject.StoreFile<SpecificClass>(specificClassObject, (x, y) => x.PDFFileContent = y, (x, y) => x.MyOrYourFileName = y, (x, y) => x.ContentTypeWhatEver = y);