2 回答

TA貢獻1829條經驗 獲得超13個贊
屬性是一種方法,但如果您想避免使用反射,您可以實現一個包含您需要的所有內容的類,類似于:
public enum UnitType
{
Second,
Microsecond,
Millisecond,
Minute,
Hour,
Day,
Week
}
public class Unit
{
public string Name { get; private set; }
public string Symbol { get; private set; }
public double Factor { get; private set; }
public Unit Base { get; private set; }
public Unit(UnitType unit, bool isBase = false)
{
Name = GetUnitName(unit);
Symbol = GetUnitSymbol(unit);
Factor = GetUnitFactor(unit);
if (!isBase)
Base = GetUnitBase(unit);
}
private string GetUnitName(UnitType unit)
{
switch (unit)
{
case UnitType.Second:
return "second";
case UnitType.Microsecond:
return "microsecond";
case UnitType.Millisecond:
return "millisecond";
case UnitType.Minute:
return "minute";
case UnitType.Hour:
return "hour";
case UnitType.Day:
return "day";
case UnitType.Week:
return "week";
default:
return null;
}
}
private string GetUnitSymbol(UnitType unit)
{
switch (unit)
{
case UnitType.Second:
return "s";
case UnitType.Microsecond:
return "μs";
case UnitType.Millisecond:
return "ms";
case UnitType.Minute:
return "min";
case UnitType.Hour:
return "h";
case UnitType.Day:
return "d";
case UnitType.Week:
return "w";
default:
return null;
}
}
private double GetUnitFactor(UnitType unit)
{
switch (unit)
{
case UnitType.Second:
return 1;
case UnitType.Microsecond:
return 0.000001;
case UnitType.Millisecond:
return 0.001;
case UnitType.Minute:
return 60.0;
case UnitType.Hour:
return 3600.0;
case UnitType.Day:
return 24.0;
case UnitType.Week:
return 7;
default:
return 0;
}
}
private Unit GetUnitBase(UnitType unit)
{
switch (unit)
{
case UnitType.Microsecond:
return new Unit(UnitType.Second, true);
case UnitType.Millisecond:
return new Unit(UnitType.Second, true);
case UnitType.Minute:
return new Unit(UnitType.Second, true);
case UnitType.Hour:
return new Unit(UnitType.Minute, true);
case UnitType.Day:
return new Unit(UnitType.Hour, true);
case UnitType.Week:
return new Unit(UnitType.Day, true);
default:
return null;
}
}
}
用法 :
// initiate a new Unit instance.
var unit = new Unit(UnitType.Week);
// Get values
var name = unit.Name;
var symbol = unit.Symbol;
var factor = unit.Factor;
// In case if some units doesn't have base
if (unit.Base != null)
{
var baseName = unit.Base.Name;
var baseSymbol = unit.Base.Symbol;
var baseFactor = unit.Base.Factor;
}
這只是一個簡單的示例,尚未經過充分測試,只是向您展示另一種可以實現的方法。
您還可以使用隱式運算符來獲取值 例子 :
public class Unit
{
......
public static implicit operator double(Unit v) => v.Factor;
public static implicit operator string(Unit v) => v.Symbol;
}
隱式獲取值:
var symbol = (string) unit; // will return the v.Symbol
var factor = (double) unit; // will return the v.Factor
此外,我沒有展示UnitTypes.Time,因為沒有太多關于它的代碼,但我認為示例和想法足以為您的想法提供所需的推動力。

TA貢獻1816條經驗 獲得超4個贊
我不確定你到底想做什么,但我認為屬性將是一個不錯的選擇。您可以像這樣在每個單元枚舉字段上設置屬性,并在需要時通過反射檢索它們。
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
sealed class UnitTypeAttribute : Attribute
{
public UnitType UnitType{ get; set; }
public UnitAttribute(UnitType unitT)
{
UnitType= unitT;
}
}
enum Unit
{
[UnitType(UnitTypes.Time)]
Second,
[UnitType(UnitTypes.Time)]
MicroSecond,
[UnitType(UnitTypes.Time)]
Hour
}
然后,當你想檢索它時,使用此方法(可以通用)
public static UnitType GetUnitTypeAttribute(Unit unit)
{
var memberInfo = typeof(Unit).GetMember(unit.ToString());
var result = memberInfo[0].GetCustomAttributes<UnitTypeAttribute>(false)
return ((UnitType)result).UnitType;
}
- 2 回答
- 0 關注
- 261 瀏覽
添加回答
舉報