Thứ Tư, 11 tháng 4, 2012

Kỹ thuật Reflection C#

Theo mình thấy, Reflection dùng để xác định kiểu của Object mà bạn đưa vào, và nếu như lấy giá trị của đối tượng thất bại, sẽ trả về null hoặc là giá trị nào đó do mình gán.

Ban đầu mình làm 3 hàm như sau:

    
public JsonResult ViewTempByGuid(Guid name)
{
    var image = Context.Database.Files_Temporary.FirstOrDefault(f => f.TemporaryGuid == name);
    var filePathResult =
        new FilePathResult(
            FileManagerRepository.GetPathFromObjectType(enumObjectContentType.Temporary) + "\\" + image.RealFileName,
            DpnTools.GetMIMEType(image.RealFileName));
    var img = Image.FromFile(filePathResult.FileName);
    var resizedImage = ImageHelper.ResizeImage(img, 800, 600);
    var base64 = "data:image/png;base64," + ImageHelper.ImageToBase64(resizedImage, ImageFormat.Png);

    return Json(new { base64 }, JsonRequestBehavior.AllowGet);
}

public JsonResult ViewTemp(Guid name, int left, int top)
{
    var image = Context.Database.Files_Temporary.FirstOrDefault(f => f.TemporaryGuid == name);
    var filePathResult =
        new FilePathResult(
            FileManagerRepository.GetPathFromObjectType(enumObjectContentType.Temporary) + "\\" + image.RealFileName,
            DpnTools.GetMIMEType(image.RealFileName));
    var img = Image.FromFile(filePathResult.FileName);
    var resizedImage = ImageHelper.ResizeImage(img, 72, 54);
    var base64 = "data:image/png;base64," + ImageHelper.ImageToBase64(resizedImage, ImageFormat.Png);

    return Json(new { name, base64, left, top }, JsonRequestBehavior.AllowGet);
}

////[HttpPost]
public string ShowCameraThumb(int id)
{
    var image = Context.Database.Files_Uploaded.FirstOrDefault(f => f.ID == id);
    var filePathResult =
        new FilePathResult(
            FileManagerRepository.GetPathFromObjectType(enumObjectContentType.CameraSpot) + "\\" + image.RealFileName,
            DpnTools.GetMIMEType(image.RealFileName));
    var img = Image.FromFile(filePathResult.FileName);
    var resizeImage = ImageHelper.ResizeImage(img, 72, 54);
    var base64 = "data:image/png;base64," + ImageHelper.ImageToBase64(resizeImage, ImageFormat.Png);
    return base64;
}
Vì thấy 3 hàm trên xử lý quá giống nhau, nên muốn viết nó thành một hàm, tất nhiên chưa nhiều đến mức để nghĩ đến việc viết theo hướng đối tượng, và mình đã dùng Reflection như ở dưới
public static string ConvertImageToBase64(Object o, int type=0)//2
{
    //enumObjectContentType enumObjectContentType = enumObjectContentType.Temporary;
    var enumObjectContentType = o.GetType().GetProperty("EnumObjectContentType").GetValue(o, null);
    var realFileName = o.GetType().GetProperty("RealFileName").GetValue(o, null);
    var width = 72;
    var height = 54;
    if (type == 2)
    {
        width = 800;
        height = 600;
    }
    var filePathResult =
        new FilePathResult(
            FileManagerRepository.GetPathFromObjectType((enumObjectContentType) enumObjectContentType) + "\\" +
            realFileName, DpnTools.GetMIMEType(realFileName.ToString()));
    return "data:image/png;base64," +
            ImageHelper.ImageToBase64(
                ImageHelper.ResizeImage(Image.FromFile(filePathResult.FileName), width, height), ImageFormat.Png);
}
Và sử dụng như sau:
var image = Context.Database.Files_Temporary.FirstOrDefault(f => f.TemporaryGuid == name);
var base64 = AcceptanceRepository.ConvertImageToBase64(image); 
Khi đó, object sẽ tự xác định type.

1 nhận xét:

  1. Play Slots Online from the Top Online Casino Sites
    The 메리트 카지노 best casino site you can play at has one or two slots. Slots is a huge casino game with an 인카지노 ever-growing base of players who are 카지노 looking for a great

    Trả lờiXóa