Я встречаю проблему с типом contraint C# now.Проблема с отображением типа C#
Я написал пару методов, которые могут преобразовывать объект в строку и преобразовывать строку в объект. ex.
static string ConvertToString(Type type, object val) {
if (type == typeof(string)) return (string)val;
if (type == typeof(int)) return val.ToString();
if (type.IsSubclassOf(typeof(CodeObject))) return ((CodeObject)val).Code;
}
static T ConvertToObject<T>(string val) {
Type type = typeof(T);
if (type == typeof(string)) return (T)(object)val;
if (type == typeof(int)) return (T)(object)int.Parse(val);
if (type.IsSubclassOf(typeof(CodeObject))) return Codes.Get<T>(val);
}
где CodeObject является базовым классом сотрудников, офисы ... которые могут принести статическим методом Codes.Get, где T: CodeObject
но приведенный выше код не может быть скомпилирован, так как ошибка # CS0314
должен быть общий тип Т метода ConvertToObject не имеют каких-либо ограничений, но Codes.Get запрос T подкласс CodeObject
я пытался использовать перегрузку, чтобы решить эту проблему, но п ot ok.
Есть ли способ устранить эту проблему? как отражение?
просьба уточнить, ConvertToObject (строка строка) должна быть ConvertToObject (строка Вал), как ул не упоминается в теле метода, но Допустимы. –
Handcraftsman
1. 'InSubclassOf' ->' IsSubclassOf' 2. 'val' ->' str' 3. Отсутствие операторов возврата для обоих методов. Лучше всего отправлять код, который компилируется, он помогает получить правильный ответ. – Kobi
Учитывая ответы с ограничением типа, проверки типов в ConvertToObject теперь излишни, поскольку общее ограничение не позволяет пользователю вызывать 'ConvertToObject' в первую очередь. Проверка типа для 'type.InSubclassOf (typeof (CodeObject)' является излишней, так как условие гарантии всегда выполняется. Весь метод можно свести к 'T ConvertToObject (строка str) {return Codes.Get (str); } 'или просто бесполезная оболочка вокруг другого метода. Другими словами, вам не нужен какой-либо метод, который вы пытаетесь написать. –
Juliet