如何从string的字符串(类名)初始化对象.格式化参数对象数组
本文关键字:对象 初始化 格式化 数组 参数 类名 string 字符串 | 更新日期: 2023-09-27 17:54:58
我的想法是用string.Format()占位符{0}…{n}在数据库中。占位符值类型以逗号分隔格式(CSV)存储在另一个名为"Parameters"的数据库字段中。
数据库中的文本示例:
发送方:{0}
地址:{1}接收机:{2}
地址:{3}
"Parameters"字段包含:
公司。FullName,Company.Address.FullAddress,客户。FullName,Customer.Address.FullAddress
我希望很明显,"公司","客户"answers"地址"表示类。FullName和FullAddress表示返回字符串的属性。"Company"answers"Customer" 对象能够根据请求加载正确的Address。
我正在考虑使用"params object[] params"与字符串。format ()传递值。
现在的问题是如何加载正确的对象并将匹配的参数计数传递给字符串。方法?
需求- 数据库中的文本必须是可编辑的;
- 占位符计数可能被更改(添加或删除);
- 每个占位符在"Parameters"数据库字段中有相应的参数;
- 每个参数代表一个类名称及其属性。可以调用子类,但它们必须用点(.)分隔。例子: Company.Address.FullAddress ,
- 只需要对象(s)特定于数据库中的文本应该创建或加载。这不是一个好主意加载一堆对象只是以防万一;
- 如果只有一种方法可以处理任务,那就太好了;
- 如果有合适的图案,可以使用任何图案。也许是Composite、Factory或者Builder模式?
作为一个解决方案,我看到:
- 硬编码每个数据库记录加载的对象。这要求不能更改带有占位符的文本。所以这个方案不适合我。
- 每个参数使用反射加载对象。这将是一个很好的动态方式来做到这一点,但如何加载正确的"地址"对象与客户地址信息?客户对象由其CustomerId创建/加载。
我已经走了这么远:
public string FillTemplate(int languageId, long templateTypeId, params object[] parameters)
{
string formatStringFromDb = LoadTemplateContentFromDb(languageId, templateTypeId);
return string.Format(formatStringFromDb, parameters);
}
public object[] LoadTemplateParameter(int languageId, long templateTypeId)
{
string csvTemplateParameters = LoadTemplateParametersFromDb(languageId, templateTypeId);
string[] stringParameters = csvTemplateParameters.Split(',');
object[] templateParametersToReturn = new object[stringParameters.Length];
for (int i = 0; i < stringParameters.Length; i++)
{
// Split class name(s) and property
string[] classAndPropertyNames = stringParameters[i].Split('.');
// Initialise and add the object to the parameter object array
templateParametersToReturn[i] = InitialiseParameterObject(classAndPropertyNames);
}
return templateParametersToReturn;
}
private static object InitialiseParameterObject(string[] classAndPropertyNames)
{
// Now what? How do I create new object(s) from a string?
// To create a Customer or Company class an appropriate ID is needed.
// How do I know which ID (Customer or Company)
// do I need to provide in advance?
throw new NotImplementedException();
}
如果你能读到这里,谢谢你。如果你能给我一些建议就更好了:)
p。目前LoadTemplateContentFromDb和LoadTemplateParametersFromDb对数据库进行两个单独的调用,但我将重构它,以便一次询问整个模板信息。
一旦你有了这个对象,以及它的属性的字符串,我为其他东西写的这些方法可以帮助:
/// <summary>
/// Gets an object property's value, recursively traversing it's properties if needed.
/// </summary>
/// <param name="FrameObject">The object.</param>
/// <param name="PropertyString">The object property string.
/// Can be the property of a property. e.g. Position.X</param>
/// <returns>The value of this object's property.</returns>
private object GetObjectPropertyValue(Object FrameObject, string PropertyString)
{
object Result = FrameObject;
string[] Properties = PropertyString.Split('.');
foreach (var Property in Properties)
{
Result = Result.GetType().GetProperty(Property).GetValue(Result, null);
}
return Result;
}
public Type GetObjectPropertyType(string ObjectName, string PropertyString)
{
Object Result = GetObjectByName(ObjectName);
string[] Properties = PropertyString.Split('.');
foreach (var Property in Properties)
{
Result = Result.GetType().GetProperty(Property).GetValue(Result, null);
}
return Result.GetType();
}
要进入string.Format()
,您可以使用上述方法从属性字符串数组转到属性本身。然后将其作为string.Format()
的最后一个参数传递。