gpt4 book ai didi

c# - 编译时基于设计模型的系统

转载 作者:行者123 更新时间:2023-11-30 23:00:23 24 4
gpt4 key购买 nike

我有一个模型类很少的系统,每个模型类都有另一个成员,但是所有模型的行为都是相同的-

例如,所有模型都是以这种格式请求用户输入:
您好,请输入 {MemberName} 值作为 {MemberType}:
并将输入转换为 MemberType。

因为这打算成为图书馆,我希望在每个模型中我都可以在编译时访问他的成员(或类似成员),而不是通过 myModel.get("memberName"),而是通过 myModel.memberNamemyModel.get(modelEnum.MemberName)myModel.ListOfMember[0] 或者 Factory。 getMember(myModel, SpecificModelMembersList[0]) 等等。

我不需要在运行时添加或删除成员,只需创建一种在编译时添加它们的好方法,而不需要更改所有用于向模型类添加成员的代码。

你会如何设计它?

我使用 C#。

谢谢,您可以提出英文修复建议。

最佳答案

我的想法是使用 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 .

关于c# - 编译时基于设计模型的系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51606020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com