我有问题,我的本地化属性,如:
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
public LocalizedDisplayNameAttribute(string resourceId)
: base(GetMessageFromResource(resourceId))
{ }
private static string GetMessageFromResource(string resourceId)
{
var propertyInfo = typeof(Lockit).GetProperty(resourceId, BindingFlags.Static | BindingFlags.Public);
return (string)propertyInfo.GetValue(null, null);
}
}
当我使用这个属性的属性它的定位在PropertyGrid中,但是当我改变当前CultureInfo它不会刷新,即使我再创建此PropertyGrid中。 我已经尝试通过手动调用属性:
foreach (PropertyInfo propertyInfo in myPropertiesInfoTab)
{
object[] custom_attributes = propertyInfo.GetCustomAttributes(false);
}
该物业构造函数被调用,而新创建的PropertyGrid中仍然有旧文化的显示名称(总是像第一次创建相同的值)的属性。
当我重新启动应用程序,但我不希望这样做它的工作原理。 有没有什么解决办法吗?
我们可以在一个简单但完整的示例重现此(仅添加计数器上的名字,以表示每个翻译,因为它发生):
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Show();
Show();
}
static void Show()
{
using(var grid = new PropertyGrid
{Dock = DockStyle.Fill, SelectedObject = new Foo { Bar = "def"} })
using(var form = new Form { Controls = { grid }})
{
form.ShowDialog();
}
}
class Foo
{
[CheekyDisplayName("abc")]
public string Bar { get; set; }
}
public class CheekyDisplayNameAttribute : DisplayNameAttribute
{
public CheekyDisplayNameAttribute(string resourceId)
: base(GetMessageFromResource(resourceId))
{ }
private static string GetMessageFromResource(string resourceId)
{
return resourceId + Interlocked.Increment(ref counter);
}
private static int counter;
}
这表明属性被缓存调用之间。 也许是解决这一问题的最简单方法是翻译耽误了时间DisplayName
查询:
public class CheekyDisplayNameAttribute : DisplayNameAttribute
{
public CheekyDisplayNameAttribute(string resourceId)
: base(resourceId)
{ }
private static string GetMessageFromResource(string resourceId)
{
return resourceId + Interlocked.Increment(ref counter);
}
public override string DisplayName
{
get { return GetMessageFromResource(base.DisplayName); }
}
private static int counter;
}
然而,注意,这可以被称为很多次(每表示36); 你可能想用它缓存文化沿着缓存值:
private CultureInfo cachedCulture;
private string cachedDisplayName;
public override string DisplayName
{
get
{
var culture = CultureInfo.CurrentCulture;
if (culture != cachedCulture)
{
cachedDisplayName = GetMessageFromResource(base.DisplayName);
cachedCulture = culture;
}
return cachedDisplayName;
}
}