[英]C# Getting the Type of a Public Variable based on an Enum value
我有一個類從逗號分隔的文本文件中解析數據。 我有一個字段的枚舉,以幫助我更輕松地解析數據。 解析所有記錄的類保存每個字段的公共變量,當然還有它們的變量類型。 我需要根據給定的枚舉來獲取這些變量的類型。
public enum DatabaseField : int
{
NumID1 = 1,
NumID2 = 2,
NumID3 = 3,
};
public class DataBaseRecordInfo
{
public long NumID1 { get; set; }
public int NumID2 { get; set; }
public short NumID3 { get; set; }
public static Type GetType(DatabaseField field)
{
Type type;
switch (field)
{
case DatabaseField.NumID1:
type = typeof(long);
break;
case DatabaseField.NumID2:
type = typeof(int);
break;
case DatabaseField.NumID3:
type = typeof(short);
break;
default:
type = typeof(int);
break;
}
return type;
}
};
NumID1,NumID2,NumID3都在我的構造函數中分配。 但是,我希望在不創建DataBaseRecordInfo
實例的情況下獲取這些類型。 現在我上面的靜態方法可行,但是,如果我想更改變量類型,我將不得不在2個位置更改它。 有沒有辦法繞過這兩個地方改變它並將其保持為靜態方法?
如果名稱始終完全匹配,則可以使用反射執行此操作。
return typeof(DataBaseRecordInfo)
.GetProperty(field.ToString(), BindingFlags.Public | BindingFlags.Instance)
.PropertyType;
您甚至可以將這些值緩存在字典中,因此如果找到,只需返回字典條目,否則使用反射確定並緩存結果。
是的,您可以使用枚舉中的名稱和DatabaseRecordInfo類型的反射來獲取所需的類型。
這可以這樣做:
public class DataBaseRecordInfo
{
public long NumID1 { get; set; }
public int NumID2 { get; set; }
public short NumID3 { get; set; }
public static Type GetType(DatabaseField field)
{
string name = field.ToString();
Type recordType = typeof (DataBaseRecordInfo);
var props = recordType.GetProperties();
var matchedProperty = props.Where(p => name == p.Name).FirstOrDefault();
if (matchedProperty == null)
return null; // We do not have a matching property.
return matchedProperty.PropertyType;
}
};
您可能希望將結果緩存在字典中,因為反射在性能方面可能很昂貴。
這樣的事情怎么樣:
public static Type GetType(DatabaseField field)
{
DataBaseRecordInfo dbri = new DataBaseRecordInfo();
switch (field)
{
case DatabaseField.NumID1:
return dbri.NumID1.GetType();
case DatabaseField.NumID2:
return dbri.NumID2.GetType();
case DatabaseField.NumID3:
return dbri.NumID3.GetType();
default:
return typeof(int);
}
}
我知道你說過,不必創建DataBaseRecordInfo
的實例,但我假設你的意思是靜態方法之外的實例。 沒有人見過這個例子。
如果要將枚舉值與一些其他信息綁定,可以使用自己的CustomAttribute。
也許你需要這樣的東西:
public class DatabaseTypeAttribute : Attribute
{
public DatabaseTypeAttribute(Type type)
{
Type = type;
}
public Type Type { get; private set; }
}
public enum DatabaseField : int
{
[DatabaseType(typeof(long))]
NumID1 = 1,
[DatabaseType(typeof(int))]
NumID2 = 2,
[DatabaseType(typeof(short))]
NumID3 = 3,
NumID4 = 4,
};
public static class DatabaseFieldHelper
{
public static Type GetDatabaseType(this DatabaseField field)
{
var attributes = (DatabaseTypeAttribute[])typeof(DatabaseField).GetField(Enum.GetName(typeof(DatabaseField), field))
.GetCustomAttributes(typeof(DatabaseTypeAttribute), false);
if (attributes.Length == 0)
return typeof(int); //returns default type
return attributes[0].Type;
}
}
//prints: NumID1 database type: System.Int64
Console.WriteLine("NumID1 database type: {0}", DatabaseField.NumID1.GetDatabaseType());
//prints: NumID2 database type: System.Int32
Console.WriteLine("NumID2 database type: {0}", DatabaseField.NumID2.GetDatabaseType());
//prints: NumID3 database type: System.Int16
Console.WriteLine("NumID3 database type: {0}", DatabaseField.NumID3.GetDatabaseType());
//prints: NumID4 database type: System.Int32
Console.WriteLine("NumID4 database type: {0}", DatabaseField.NumID4.GetDatabaseType());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.