PDA

View Full Version : ايراد در اجراي تابع



Qermezkon
یک شنبه 02 اسفند 1388, 05:58 صبح
ايراد تابع زير چي مي تونه باشه.
با VS 2008 مشكلي نداره اما در VS 2010 و NET Frame Work 4.0 با خطا مواجه مي شه


CultureInfo fa = (from p in cultures
where p.LCID == 1065
select p).FirstOrDefault();
PersianCultureHelper.SetPersianOptions(fa);
//***********************************************
namespace PersianDeveloper
{
using System;
using System.Globalization;
using System.Reflection;

public static class PersianCultureHelper
{
private static PropertyInfo calendarID = typeof(Calendar).GetProperty("ID", BindingFlags.NonPublic | BindingFlags.Instance);
private static FieldInfo cultureInfoCalendar = typeof(CultureInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
private static FieldInfo cultureInfoReadOnly = typeof(CultureInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
private static MethodInfo cultureTableRecordUseCurrentCalendar = typeof(DateTimeFormatInfo).Assembly.GetType("System.Globalization.CultureTableRecord").GetMethod("UseCurrentCalendar", BindingFlags.NonPublic | BindingFlags.Instance);
private static FieldInfo dateTimeFormatInfoCalendar = typeof(DateTimeFormatInfo).GetField("calendar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
private static FieldInfo dateTimeFormatInfoCultureTableRecord = typeof(DateTimeFormatInfo).GetField("m_cultureTableRecord", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
private static FieldInfo dateTimeFormatInfoReadOnly = typeof(DateTimeFormatInfo).GetField("m_isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
private static FieldInfo numberFormatInfoReadOnly = typeof(NumberFormatInfo).GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

public static void InitPersianDateTimeFormat(DateTimeFormatInfo dateTimeFormat)
{
PersianCalendar calendar = new PersianCalendar();
bool flag = (bool) dateTimeFormatInfoReadOnly.GetValue(dateTimeFormat );
if (flag)
{
dateTimeFormatInfoReadOnly.SetValue(dateTimeFormat , false);
}
dateTimeFormatInfoCalendar.SetValue(dateTimeFormat , calendar);
object obj2 = dateTimeFormatInfoCultureTableRecord.GetValue(date TimeFormat);
cultureTableRecordUseCurrentCalendar.Invoke(obj2, new object[] { calendarID.GetValue(calendar, null) });
dateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
dateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
dateTimeFormat.DayNames = new string[] { "يكشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
dateTimeFormat.AbbreviatedMonthNames = new string[] { "فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.MonthNames = new string[] { "فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dateTimeFormat.AMDesignator = "ق.ظ";
dateTimeFormat.PMDesignator = "ب.ظ";
dateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;
dateTimeFormat.FullDateTimePattern = "yyyy MMMM dddd, dd HH:mm:ss";
dateTimeFormat.LongDatePattern = "yyyy MMMM dddd, dd";
dateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
if (flag)
{
dateTimeFormatInfoReadOnly.SetValue(dateTimeFormat , true);
}
}

public static void InitPersianNumberFormat(CultureInfo info)
{
InitPersianNumberFormat(info.NumberFormat);
}

public static void InitPersianNumberFormat(NumberFormatInfo info)
{
bool flag = (bool) numberFormatInfoReadOnly.GetValue(info);
if (flag)
{
numberFormatInfoReadOnly.SetValue(info, false);
}
info.NativeDigits = new string[] { "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩" };
if (flag)
{
numberFormatInfoReadOnly.SetValue(info, true);
}
}

public static void SetPersianCalendar(CultureInfo culture, DateTimeFormatInfo dateTimeFormat)
{
PersianCalendar calendar = new PersianCalendar();
bool flag = (bool) cultureInfoReadOnly.GetValue(culture);
if (flag)
{
cultureInfoReadOnly.SetValue(culture, false);
}
culture.DateTimeFormat = dateTimeFormat;
InitPersianDateTimeFormat(dateTimeFormat);
cultureInfoCalendar.SetValue(culture, calendar);
InitPersianNumberFormat(culture);
if (flag)
{
cultureInfoReadOnly.SetValue(culture, true);
}
}

public static void SetPersianOptions(CultureInfo culture)
{
SetPersianCalendar(culture, culture.DateTimeFormat);
}
}
}

farsica
جمعه 10 اردیبهشت 1389, 18:14 عصر
سلام دوست عزیز
علت این خطا این است که dateTimeFormatInfoCultureTableRecord در دات نت 4 null می باشد.
راه حل اینجاست که بدون استفاده از این تابع هم کد بدرستی کار خواهد کرد.


CultureInfo culture = new CultureInfo("fa-IR");
DateTimeFormatInfo info = culture.DateTimeFormat;
info.AbbreviatedDayNames = new String[] { "ى", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new String[] { "يکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new String[] { "فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دي", "بهمن", "اسفند", "" };
info.MonthNames = new String[] { "فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دي", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
culture.DateTimeFormat = info;
culture.DateTimeFormat = info;
PersianCalendar PersianCal = new PersianCalendar();
typeof(DateTimeFormatInfo).GetField("calendar", (BindingFlags.NonPublic | (BindingFlags.Public | BindingFlags.Instance))).SetValue(info, PersianCal);
typeof(CultureInfo).GetField("calendar", (BindingFlags.NonPublic | (BindingFlags.Public | BindingFlags.Instance))).SetValue(culture, PersianCal);




این متد کار شما را انجام می دهد
موفق باشید