亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編譯時設計基于模型的系統

編譯時設計基于模型的系統

C#
江戶川亂折騰 2021-11-07 19:38:07
我有一個模型類很少的系統,每個類都有另一個成員,但所有模型的行為都是相同的-例如,所有模型都是來自用戶的請求輸入格式為: Hi, Please enter {MemberName} value as {MemberType}:并將輸入轉換為 MemberType。因為這打算成為庫,所以我希望在每個模型中我都可以在編譯時訪問他的成員(或類似成員)myModel.get("memberName"),而不是 by ,而是 bymyModel.memberName或myModel.get(modelEnum.MemberName)ormyModel.ListOfMember[0]或者也許Factory.getMember(myModel, SpecificModelMembersList[0])等等。我不需要在運行時添加或刪除成員,只需創建一個在編譯時添加它們的好方法,而不是更改將成員添加到模型類的所有代碼。你會如何設計它?我使用 C#。謝謝你,你可以建議一個英文修復。
查看完整描述

1 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

我的想法是使用 lambda 表達式以簡單直觀的方式訪問屬性信息數據(使用 IntelliSense 支持和所有可用的重構)。演示該方法的代碼如下。


using System;

using System.Linq.Expressions;

using System.Reflection;


namespace ConsoleAppTest2

{

    class Program

    {

        static void Main(string[] args)

        {

            var myModel = new MyModel();


            var cmb = ConsoleModelBuilder<MyModel>.RequestFromComsole(myModel)

                .FillProp(x=>x.MethodName)

                .FillProp(x => x.Birthday);

            Console.ReadLine();

        }

    }


    internal class MyModel

    {

        public int MethodName { get; set; }

        public DateTime Birthday { get; set; }


    }


    internal class ConsoleModelBuilder<T>

    {

        public T Model { get; private set; }


        public static ConsoleModelBuilder<T> RequestFromComsole(T obj)

        {

            return new ConsoleModelBuilder<T>() { Model = obj };



        }


        public ConsoleModelBuilder<T> FillProp<TProperty>(Expression<Func<T, TProperty>> propertyLambda)

        {

            PropertyInfo info = GetPropertyInfo(Model, propertyLambda);


            Console.WriteLine($"Hi, Please enter {info.Name} value as {info.PropertyType.Name}:");

            //Code to parse console input and fill property of Model

            return this;

        }



        public PropertyInfo GetPropertyInfo<TSource, TProperty>(

    TSource source,

    Expression<Func<TSource, TProperty>> propertyLambda)

        {

            Type type = typeof(TSource);


            MemberExpression member = propertyLambda.Body as MemberExpression;

            if (member == null)

                throw new ArgumentException(string.Format(

                    "Expression '{0}' refers to a method, not a property.",

                    propertyLambda.ToString()));


            PropertyInfo propInfo = member.Member as PropertyInfo;

            if (propInfo == null)

                throw new ArgumentException(string.Format(

                    "Expression '{0}' refers to a field, not a property.",

                    propertyLambda.ToString()));


            if (type != propInfo.ReflectedType &&

                !type.IsSubclassOf(propInfo.ReflectedType))

                throw new ArgumentException(string.Format(

                    "Expression '{0}' refers to a property that is not from type {1}.",

                    propertyLambda.ToString(),

                    type));


            return propInfo;

        }

    }

}

訪問 PropertyInfo 的核心方法來自 StackOverflow 問題Retrieving Property name from lambda expression。


查看完整回答
反對 回復 2021-11-07
  • 1 回答
  • 0 關注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號