Самый простой способ создания подклассов C# System.Type
Мне нужно, чтобы класс чисел с фиксированной точкой наследовал от System.Type.
class FixedPoint : Type
{
public bool Signed { get; set; }
public int Width { get; set; }
public int IntegerWidth { get; set; }
public FixedPoint(Boolean signed = false, int width = 16, int integerWidth = 8)
{
Signed = signed;
Width = width;
IntegerWidth = integerWidth;
}
}
Когда я пытался скомпилировать этот код, я получал сообщения об ошибках, в которых говорилось, что мне нужно реализовать методы, поскольку Type является абстрактным классом.
userdef.cs(3,7): error CS0534: 'FixedPoint' does not implement inherited abstract member 'System.Type.GUID.get'
userdef.cs(3,7): error CS0534: 'FixedPoint' does not implement inherited abstract member 'System.Type.Namespace.get'
c:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll: (Location of symbol related to previous error)
userdef.cs(3,7): error CS0534: 'FixedPoint' does not implement inherited abstract member
'System.Type.AssemblyQualifiedName.get'
Как я могу избежать этих сообщений об ошибках? Есть ли простой способ для подкласса типа? Должен ли я реализовать все методы? Если это так, есть ли ссылки для этого?
Или же
Стоит ли пытаться работать с подклассами Type? По некоторым причинам мне нужно создать подкласс Type, если это действительно трудно сделать. Я бы лучше сдался рано, чтобы найти другой путь.
2 ответа
Вы говорите, что у вас есть причины для наследования от System.Type
, хотя я согласен с @mootinator, вот некоторые ответы на другие ваши вопросы:
Есть ли простой способ для подкласса типа?
Нет.
Должен ли я реализовать все методы?
Да.
Если это так, есть ли ссылки для этого?
Вы добавляете override
ключевое слово для каждого из Properties
а также Methods
Это пример того, как вы начинаете, вам нужно override
каждый из abstract
свойства и методы.
public class Test : Type
{
public override Guid GUID
{
get { throw new NotImplementedException(); }
}
}
Это полный скомпилированный class
который перекрывает все properties
а также methods
это необходимо, но ничего не реализовано.
public class Test : Type
{
public override Guid GUID
{
get { throw new NotImplementedException(); }
}
public override bool IsDefined(Type attributeType, bool inherit)
{
throw new NotImplementedException();
}
public override object[] GetCustomAttributes(bool inherit)
{
throw new NotImplementedException();
}
public override string Name
{
get { throw new NotImplementedException(); }
}
protected override bool HasElementTypeImpl()
{
throw new NotImplementedException();
}
public override object[]
GetCustomAttributes(Type attributeType, bool inherit)
{
throw new NotImplementedException();
}
public override Type UnderlyingSystemType
{
get { throw new NotImplementedException(); }
}
public override Type GetElementType()
{
throw new NotImplementedException();
}
protected override bool IsCOMObjectImpl()
{
throw new NotImplementedException();
}
protected override bool IsPrimitiveImpl()
{
throw new NotImplementedException();
}
protected override bool IsPointerImpl()
{
throw new NotImplementedException();
}
protected override bool IsByRefImpl()
{
throw new NotImplementedException();
}
protected override bool IsArrayImpl()
{
throw new NotImplementedException();
}
protected override System.Reflection.TypeAttributes
GetAttributeFlagsImpl()
{
throw new NotImplementedException();
}
public override System.Reflection.MemberInfo[]
GetMember(string name, System.Reflection.BindingFlags bindingAttr)
{
return base.GetMember(name, bindingAttr);
}
public override Type
GetNestedType(string name, System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.PropertyInfo[]
GetProperties(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
protected override System.Reflection.PropertyInfo
GetPropertyImpl(string name, System.Reflection.BindingFlags bindingAttr,
System.Reflection.Binder binder, Type returnType, Type[] types,
System.Reflection.ParameterModifier[] modifiers)
{
throw new NotImplementedException();
}
public override System.Reflection.MemberInfo[]
GetMembers(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override Type[] GetNestedTypes(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.EventInfo[] GetEvents()
{
return base.GetEvents();
}
public override Type[] GetInterfaces()
{
throw new NotImplementedException();
}
public override Type GetInterface(string name, bool ignoreCase)
{
throw new NotImplementedException();
}
public override System.Reflection.EventInfo[]
GetEvents(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.FieldInfo[]
GetFields(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.EventInfo
GetEvent(string name, System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.FieldInfo
GetField(string name, System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
public override System.Reflection.MethodInfo[]
GetMethods(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
protected override System.Reflection.MethodInfo
GetMethodImpl(string name, System.Reflection.BindingFlags bindingAttr,
System.Reflection.Binder binder, System.Reflection.CallingConventions callConvention,
Type[] types, System.Reflection.ParameterModifier[] modifiers)
{
throw new NotImplementedException();
}
public override System.Reflection.ConstructorInfo[] GetConstructors(System.Reflection.BindingFlags bindingAttr)
{
throw new NotImplementedException();
}
protected override System.Reflection.ConstructorInfo
GetConstructorImpl(System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder,
System.Reflection.CallingConventions callConvention, Type[] types,
System.Reflection.ParameterModifier[] modifiers)
{
throw new NotImplementedException();
}
public override Type BaseType
{
get { throw new NotImplementedException(); }
}
public override string AssemblyQualifiedName
{
get { throw new NotImplementedException(); }
}
public override string Namespace
{
get { throw new NotImplementedException(); }
}
public override string FullName
{
get { throw new NotImplementedException(); }
}
public override System.Reflection.Assembly Assembly
{
get { throw new NotImplementedException(); }
}
public override System.Reflection.Module Module
{
get { throw new NotImplementedException(); }
}
public override object
InvokeMember(string name, System.Reflection.BindingFlags invokeAttr,
System.Reflection.Binder binder, object target, object[] args,
System.Reflection.ParameterModifier[] modifiers,
System.Globalization.CultureInfo culture, string[] namedParameters)
{
throw new NotImplementedException();
}
}
Это свойства, которые вам нужно реализовать
- GUID
- BaseType
- AssemblyQualifiedName
- Пространство имен
- ФИО
- сборочный
- модуль
- UnderlyingSystemType
- название
Это методы, которые вам нужно реализовать
- InvokeMember
- GetConstructorImpl
- GetConstructors
- GetMethodImpl
- GetMethods
- GetField
- GetEvent
- GetFields
- GetEvents
- GetInterface
- GetInterfaces
- GetEvents
- GetNestedTypes
- GetMembers
- GetPropertyImpl
- GetProperties
- GetNestedType
- GetMember
- GetAttributeFlagsImpl
- IsArrayImpl
- IsByRefImpl
- IsPointerImpl
- IsPrimitiveImpl
- IsCOMObjectImpl
- GetElementType
- GetCustomAttributes
- HasElementTypeImpl
- GetCustomAttributes
- Определено
Как вы можете видеть, есть довольно много, что вам нужно переопределить, чтобы удалить все ошибки компиляции, поэтому либо у вас есть действительно веская причина для этого, либо вы должны подумать о переопределении из другого класса / структуры или просто создать новый класс / структуру.
Если вы пытаетесь создать новый тип значения, просто используйте struct
вместо class
(нет подклассов Type
требуется).
В противном случае, чего вы хотите достичь с помощью подклассов Type
что вы не можете сделать с typeof(TypeName)
?