สำหรับชนิดในตัวคุณสามารถใช้การแจงนับ TypeCode โปรดทราบว่า GetType () นั้นช้า แต่อาจไม่เกี่ยวข้องในสถานการณ์ส่วนใหญ่
switch (Type.GetTypeCode(someObject.GetType()))
{
case TypeCode.Boolean:
break;
case TypeCode.Byte:
break;
case TypeCode.Char:
break;
}
สำหรับประเภทที่กำหนดเองคุณสามารถสร้างการแจงนับของคุณเองและอินเทอร์เฟซหรือคลาสพื้นฐานที่มีคุณสมบัตินามธรรมหรือวิธีการ ...
การใช้งานระดับนามธรรมของคุณสมบัติ
public enum FooTypes { FooFighter, AbbreviatedFool, Fubar, Fugu };
public abstract class Foo
{
public abstract FooTypes FooType { get; }
}
public class FooFighter : Foo
{
public override FooTypes FooType { get { return FooTypes.FooFighter; } }
}
การใช้งานระดับนามธรรมของวิธีการ
public enum FooTypes { FooFighter, AbbreviatedFool, Fubar, Fugu };
public abstract class Foo
{
public abstract FooTypes GetFooType();
}
public class FooFighter : Foo
{
public override FooTypes GetFooType() { return FooTypes.FooFighter; }
}
การใช้อินเตอร์เฟสของคุณสมบัติ
public enum FooTypes { FooFighter, AbbreviatedFool, Fubar, Fugu };
public interface IFooType
{
FooTypes FooType { get; }
}
public class FooFighter : IFooType
{
public FooTypes FooType { get { return FooTypes.FooFighter; } }
}
การใช้อินเตอร์เฟสของวิธีการ
public enum FooTypes { FooFighter, AbbreviatedFool, Fubar, Fugu };
public interface IFooType
{
FooTypes GetFooType();
}
public class FooFighter : IFooType
{
public FooTypes GetFooType() { return FooTypes.FooFighter; }
}
เพื่อนร่วมงานคนหนึ่งของฉันเพิ่งบอกฉันเกี่ยวกับเรื่องนี้เช่นกัน: นี่เป็นข้อได้เปรียบที่คุณสามารถใช้เพื่อวัตถุประเภทใดก็ได้ไม่ใช่แค่ที่คุณกำหนดไว้ มันมีข้อเสียของการเป็นใหญ่ขึ้นและช้าลง
ก่อนกำหนดคลาสแบบคงที่เช่นนี้:
public static class TypeEnumerator
{
public class TypeEnumeratorException : Exception
{
public Type unknownType { get; private set; }
public TypeEnumeratorException(Type unknownType) : base()
{
this.unknownType = unknownType;
}
}
public enum TypeEnumeratorTypes { _int, _string, _Foo, _TcpClient, };
private static Dictionary<Type, TypeEnumeratorTypes> typeDict;
static TypeEnumerator()
{
typeDict = new Dictionary<Type, TypeEnumeratorTypes>();
typeDict[typeof(int)] = TypeEnumeratorTypes._int;
typeDict[typeof(string)] = TypeEnumeratorTypes._string;
typeDict[typeof(Foo)] = TypeEnumeratorTypes._Foo;
typeDict[typeof(System.Net.Sockets.TcpClient)] = TypeEnumeratorTypes._TcpClient;
}
/// <summary>
/// Throws NullReferenceException and TypeEnumeratorException</summary>
/// <exception cref="System.NullReferenceException">NullReferenceException</exception>
/// <exception cref="MyProject.TypeEnumerator.TypeEnumeratorException">TypeEnumeratorException</exception>
public static TypeEnumeratorTypes EnumerateType(object theObject)
{
try
{
return typeDict[theObject.GetType()];
}
catch (KeyNotFoundException)
{
throw new TypeEnumeratorException(theObject.GetType());
}
}
}
และจากนั้นคุณสามารถใช้มันเช่นนี้:
switch (TypeEnumerator.EnumerateType(someObject))
{
case TypeEnumerator.TypeEnumeratorTypes._int:
break;
case TypeEnumerator.TypeEnumeratorTypes._string:
break;
}