我正在尝试创建一个通用图片上传功能,所以我可以将它用于包含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;
}
}
}
有没有办法传递匿名类型或在这种情况下有用的东西?
答案 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);