第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

豐富枚舉 - 可能嗎?

豐富枚舉 - 可能嗎?

C#
大話西游666 2023-12-17 19:59:37
我正在尋找一種解決方案來將不可變數(shù)據(jù)存儲(chǔ)在我的代碼而不是數(shù)據(jù)庫中。在具體情況下,我想處理單位。這是重量單位的示例(它們不會(huì)改變,所以可以將它們存儲(chǔ)在我的代碼中):public class Unit    {        public Unit() { }        public Unit(string name, string symbol, double factor, Unit baseUnit, UnitType unitType)        {            this.Name = name;            this.Symbol = symbol;            this.Factor = factor;            this.BaseUnit = baseUnit;            this.UnitType = unitType;        }        public int Id { get; set; }        public string Name { get; set; }        public UnitType UnitType { get; set; }        public string Symbol { get; set; }        public string NamePlural { get; set; }        public Unit BaseUnit { get; set; }        public double Factor { get; set; }    }    public static class TimeUnits    {        public static Unit second = new Unit("second", "s", 1, null, UnitTypes.Time);        public static Unit microsecond = new Unit("microsecond", "μs", 0.000001, second, UnitTypes.Time);        public static Unit millisecond = new Unit("millisecond", "ms", 0.001, second, UnitTypes.Time);        public static Unit minute = new Unit("minute", "min", 60.0, second, UnitTypes.Time);        public static Unit hour = new Unit("hour", "h", 3600.0, second, UnitTypes.Time);        public static Unit day = new Unit("day", "d", 24.0, hour, UnitTypes.Time);        public static Unit week = new Unit("week", "w", 7, day, UnitTypes.Time);    }如前所述,我不想將這些不可變信息存儲(chǔ)在數(shù)據(jù)庫中,以避免 ef-core 在從數(shù)據(jù)庫檢索數(shù)據(jù)時(shí)執(zhí)行額外的聯(lián)合。對(duì)于性別,我只需使用枚舉: public enum Gender{    male = 1,    female = 2,    not_applicable = 9,    dont_want_to_share = 10}我想為單位提供類似的解決方案。但枚舉只有一個(gè) ID 和一個(gè)名稱。對(duì)于上面顯示的單位或其他情況,我需要額外的屬性(例如,factore、unitType 等)。非常感謝您提供有關(guān)如何實(shí)現(xiàn)此目標(biāo)的任何提示,以便 ef core 像使用枚舉一樣加載這些值。
查看完整描述

2 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

屬性是一種方法,但如果您想避免使用反射,您可以實(shí)現(xiàn)一個(gè)包含您需要的所有內(nèi)容的類,類似于:


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;


}

這只是一個(gè)簡(jiǎn)單的示例,尚未經(jīng)過充分測(cè)試,只是向您展示另一種可以實(shí)現(xiàn)的方法。


您還可以使用隱式運(yùn)算符來獲取值 例子 :


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,因?yàn)闆]有太多關(guān)于它的代碼,但我認(rèn)為示例和想法足以為您的想法提供所需的推動(dòng)力。


查看完整回答
反對(duì) 回復(fù) 2023-12-17
?
繁華開滿天機(jī)

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊

我不確定你到底想做什么,但我認(rèn)為屬性將是一個(gè)不錯(cuò)的選擇。您可以像這樣在每個(gè)單元枚舉字段上設(shè)置屬性,并在需要時(shí)通過反射檢索它們。


    [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

}

然后,當(dāng)你想檢索它時(shí),使用此方法(可以通用)


       public static UnitType GetUnitTypeAttribute(Unit unit)

    {

        var memberInfo = typeof(Unit).GetMember(unit.ToString());

        var result = memberInfo[0].GetCustomAttributes<UnitTypeAttribute>(false)


        return ((UnitType)result).UnitType;

    }


查看完整回答
反對(duì) 回復(fù) 2023-12-17
  • 2 回答
  • 0 關(guān)注
  • 281 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)