我的World
班级有一个如下所示的属性:
public Vec2 Gravity
{
get {
Console.WriteLine("Getting gravity!");
return GetGravity();
}
set {
Console.WriteLine("Setting gravity!");
SetGravity(value);
}
}
“获得重力!” 当尝试读取该值时,字符串按预期显示PropertyGrid
,但是当我尝试更改重力矢量并按 Enter 时,没有任何反应。为什么不?
我的Vec2
班级有以下属性:
public float X
{
get
{
return x;
}
set
{
x = value;
}
}
public float Y
{
get
{
return y;
}
set
{
y = value;
}
}
由于以下原因,它们在网格上可见:
public class Vec2Converter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType)
{
if (destinationType == typeof(Vec2)) return true;
else return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)
{
if (destinationType == typeof(string) && value is Vec2)
{
Vec2 vec = (Vec2)value;
return string.Format("{0}, {1}", vec.X, vec.Y);
}
else return base.ConvertTo(context, culture, value, destinationType);
}
}
我刚刚将这两种方法添加到了Vec2Converter
,现在它可以工作了:
public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
{
if (sourceType == typeof(string)) return true;
else return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
try
{
string strVal = value as string;
var parts = strVal.Split(',');
float x = float.Parse(parts[0]);
float y = float.Parse(parts[1]);
return new Vec2(x, y);
}
catch
{
throw new ArgumentException("Can not convert '" + (string)value + "'to type Vec2");
}
}
else return base.ConvertFrom(context, culture, value);
}
它通过更改字符串表示和单个属性来工作。为什么 thix 会针对具有单个属性的情况修复它?
我认为答案是Vec2
结构,所以当返回World
向量时Gravity
,它按值传递它,然后更改副本,而不是实际的Gravity
向量。
我认为解决方案是保留CanConvertFrom
andConvertFrom
方法。我假设它们使它起作用,因为它们修改了重力向量的字符串表示,然后又更新了实际的重力向量。那个,或者创建Vec2
一个类应该可以工作,但是我现在不能真正测试它,因为我的应用程序非常依赖它是一个结构。