我有一個類的串列,我用以下代碼將其序列化到設計器生成的代碼中:
我有一個類的串列。
internal class TargetSettingsConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)。
{
return destinationType == typeof(InstanceDescriptor) || base.CanConvertTo(context, destinationType)。
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)。
{
if ( destinationType == typeof(InstanceDescriptor) && value is ControlListManager.TargetSettings)
{
ConstructorInfo constructor = typeof(ControlListManager.TargetSettings)。 GetConstructor(new[] { typeof(object), typeof(string), typeof(DisplayModes)。typeof(bool), typeof(int) 。typeof(int), typeof(int) })。)
var target = value as ControlListManager.TargetSettings;
var descriptor = new InstanceDescriptor(constructor, new[] { target. target, target.Text, target.DisplayMode, target.Fade, target.HideTimeout, target.PaddingX, target.PaddingY }, true)。)
return描述符。
}
if (culture == null) { culture = CultureInfo.CurrentCulture; }
return base.ConvertTo(context, culture, value, destinationType)。
}
}
到目前為止,這個方法運行良好,但讓我煩惱的是,我必須單獨指定型別和值。
我的第一個想法是使用GetConstructors()代替。但這樣一來,數值的問題仍然存在。我對這個問題感到非常困惑,因為我實際上是在不知道引數數量的情況下撰寫函式的--或者說只有在它是 "硬編碼 "的情況下。
有誰知道如何才能更好地完成這個任務?
編輯:資料類
[TypeConverter(typeof(TargetSettingsConverter))/span>]
public class TargetSettings : IEquatable<TargetSettings>
{
public object Target = new { };
public string Text;
public DisplayModes DisplayMode = DisplayModes.FollowXY;
public bool Fade = true;
public int HideTimeout;
public int PaddingX。
public int PaddingY;
public bool Equals(TargetSettings other)
{
return other != null && (Target.Equals(other.Target))。
}
public override bool Equals(object obj)
{
if (obj == null) { return false; }
TargetSettings objAsPart = obj as TargetSettings;
if (objAsPart == null) { return false; }
return Equals(objAsPart);
}
public override int GetHashCode()
{
return Target.GetHashCode()。
}
public TargetSettings(object目標。string text = ""/span>, DisplayModes displayMode = DisplayModes. FollowXY, bool fade = true, int hideTimeout = 0, int paddingX = 0, int paddingY = 0)
{
目標 = 目標。
文本 = 文本。
DisplayMode = displayMode;
Fade = 淡出。
HideTimeout = hideTimeout;
PaddingX = paddingX;
PaddingY = paddingY;
}
uj5u.com熱心網友回復:
根據你的問題,你想讓你的代碼在型別和值上更加動態。
因為你想要轉換的型別和值都是欄位型別。我建議你使用反射來完成這個任務。
你可以得到所有的欄位型別,如下所示:
你可以得到所有的欄位型別。
Type []tarr = typeof(TargetSettings).GetFields().Select(i => i.FieldType).ToArray() 。
ConstructorInfo constructor = typeof(TargetSettings).GetConstructor(tarr);
你可以通過以下方式獲得所有欄位的值:
你可以通過以下方式獲得所有欄位的值:
object []arr= typeof(TargetSettings).GetFields().Select(i => i.GetValue(target)).ToArray() 。
var descriptor = new InstanceDescriptor(constructor, oarr, true)。
完整的代碼:
internal class TargetSettingsConverter : TypeConverter >。
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)。
{
return destinationType == typeof(InstanceDescriptor) || base.CanConvertTo(context, destinationType)。
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)。
{
if ( destinationType == typeof(InstanceDescriptor) && value is TargetSettings)
{
Type []tarr = typeof(TargetSettings).GetFields().Select(i => i.FieldType).ToArray()。
ConstructorInfo constructor = typeof(TargetSettings).GetConstructor(tarr);
var target = value as TargetSettings;
object []arr= typeof(TargetSettings).GetFields().Select(i => i.GetValue(target)).ToArray() 。
var descriptor = new InstanceDescriptor(constructor, oarr, true)。
return descriptor。
}
if (culture == null) { culture = CultureInfo.CurrentCulture; }
return base.ConvertTo(context, culture, value, destinationType)。
}
}
[TypeConverter(typeof(TargetSettingsConverter))]
public class TargetSettings : IEquatable<TargetSettings>
{
public object Target = new { };
public string Text;
public DisplayModes DisplayMode = DisplayModes.FollowXY;
public bool Fade = true;
public int HideTimeout;
public int PaddingX。
public int PaddingY;
public bool Equals(TargetSettings other)
{
return other != null && (Target.Equals(other.Target))。
}
public override bool Equals(object obj)
{
if (obj == null) { return false; }
TargetSettings objAsPart = obj as TargetSettings;
if (objAsPart == null) { return false; }
return Equals(objAsPart);
}
public override int GetHashCode()
{
return Target.GetHashCode()。
}
public TargetSettings(object目標。string text = ""/span>, DisplayModes displayMode = DisplayModes. FollowXY, bool fade = true, int hideTimeout = 0, int paddingX = 0, int paddingY = 0)
{
目標 = 目標。
文本 = 文本。
DisplayMode = displayMode;
Fade = 淡出。
HideTimeout = hideTimeout;
PaddingX = paddingX;
PaddingY = paddingY;
}
}
public enum DisplayModes
{
FollowXY
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/317269.html
標籤:
