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

本文关键字:参数 设置 类型 种类 | 更新日期: 2023-09-27 18:06:51

我试图创建一个通用的图像上传功能,所以我可以将它用于不同的类,包含不同的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;
            }
        }
    }
在这种情况下,有没有传递匿名类型或其他东西的方法?

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

我相信你的解决方案是改变你的函数声明读起来像这样:

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

请参阅ThePerplexedOne的评论(或此),以了解为什么这个工作

有一种方法可以使用Action delegate来实现:

这是你的通用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);