Как я могу получить System.Type из строки "System.Drawing.Color" - PullRequest
4 голосов
/ 03 июня 2009

У меня есть сохраненное свойство xml некоторого элемента управления

<Prop Name="ForeColor" Type="System.Drawing.Color" Value="-16777216" />

Я хочу преобразовать его обратно как другие

System.Type type = System.Type.GetType(propertyTypeString);
object propertyObj = 
  TypeDescriptor.GetConverter(type).ConvertFromString(propertyValueString);

System.Type.GetType ("System.Drawing.Color") возвращает ноль.

Вопрос в том, как правильно получить тип цвета из строки

(лучше не делать особый случай только для свойств Color)

Обновление

время от времени этот xml будет редактироваться вручную

Ответы [ 4 ]

4 голосов
/ 03 июня 2009

Необходимо указать сборку, а также имя типа при использовании Type.GetType(), если тип не находится в mscorlib или в настоящий момент не выполняется сборка.

Если вы знаете, что он находится в сборке System.Drawing, вы можете использовать взамен Assembly.GetType() - или, возможно, просмотреть весь список возможных сборок:

Type type = candidateAssemblies.Select(assembly => assembly.GetType(typeName))
                               .Where(type => type != null)
                               .FirstOrDefault();

if (type != null)
{
    // Use it
}
else
{
    // Couldn't find the right type
}
2 голосов
/ 03 июня 2009

Вы сами храните эти свойства в XML? Если это так, просто напишите AssemblyQualifiedName объекта вместо просто FullName при создании узла. Это дает информацию о контексте сборки, необходимую для загрузки типа из строки, используя Type.GetType()

2 голосов
/ 03 июня 2009

У вас загружена сборка System.Drawing? У вас есть ссылка на это?

0 голосов
/ 03 июня 2009

Возможно, это не совсем относится к вашей проблеме, но у меня была похожая. Мне нужно было сериализовать / десериализовать Color, используя XmlSerializer. После поиска в интернете и объединения мудрости нескольких авторов я придумал класс-обёртку:

/// <summary>
/// Color that can be xml-serialized
/// </summary>
public class SerializableColor
{
    public int A { get; set; }
    public int R { get; set; }
    public int G { get; set; }
    public int B { get; set; }
    public int KnownColor { get; set; }

    /// <summary>
    /// Intended for xml serialization purposes only
    /// </summary>
    private SerializableColor() { }

    public SerializableColor(Color color)
    {
        this.A = color.A;
        this.R = color.R;
        this.G = color.G;
        this.B = color.B;
        this.KnownColor = (int)color.ToKnownColor();
    }

    public static SerializableColor FromColor(Color color)
    {
        return new SerializableColor(color);
    }

    public Color ToColor()
    {
        if (KnownColor != 0)
        {
            return Color.FromKnownColor((KnownColor)KnownColor);
        }
        else
        {
            return Color.FromArgb(A, R, G, B);
        }
    }
}

Может быть, это применимо к вашей ситуации. Видите ли, класс Color иногда сохраняет себя не как комбинацию значений ARGB, а как значение перечисления KnownColor ..., которое необходимо сохранить во время сериализации.

...