我正在寻求与这篇文章进行讨论.
我正在考虑将C#4.0动态功能集成到遗留系统中.我的明确例子是在数据层中使用Rob Connery的Massive.但是我的问题将适用于动态对象必须与现有的强类型业务对象交互的任何地方,以便在属性之间存在映射.
我可以使用以下两个(简化)方法自动转换静态(具体)对象和expando对象的转换:
public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject)
{
object instance = Activator.CreateInstance<T>();
var dict = dynObject as IDictionary<string, object>;
PropertyInfo[] targetProperties = instance.GetType().GetProperties();
foreach (PropertyInfo property in targetProperties)
{
object propVal;
if (dict.TryGetValue(property.Name, out propVal))
{
property.SetValue(instance, propVal, null);
}
}
return instance;
}
public static System.Dynamic.ExpandoObject ToExpando(object staticObject)
{
System.Dynamic.ExpandoObject expando = new ExpandoObject();
var dict = expando as IDictionary<string, object>;
PropertyInfo[] properties = staticObject.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
dict[property.Name] = property.GetValue(staticObject, null);
}
return …Run Code Online (Sandbox Code Playgroud) 我正在调整Fluent NHibernate到我们现有的遗留应用程序,并试图确定如何使用ClassMap和SubclassMap显示实体层次结构.
// BaseObject contains database columns common to every table
public class BaseObject
{
// does NOT contain database id column
public string CommonDbCol1 { get; set; }
public string CommonDbCol2 { get; set; }
// ...
}
public class Entity1 : BaseObject
{
public int Entity1Id { get; set; }
// other Entity1 properties
}
public class Entity2 : BaseObject
{
public int Entity2Id { get; set; }
// other Entity2 properties
}
Run Code Online (Sandbox Code Playgroud)
Entity1和Entity2的标识列按表唯一命名.BaseObject包含所有实体共有的列.我没有使用AutoMapping,并且认为我可以在BaseObject上使用ClassMap,然后在每个Entity上使用SubclassMap,如下所示:
public class Entity1Map : …Run Code Online (Sandbox Code Playgroud) 我正在研究一种通用方法,该方法将对从CollectionBase派生的自定义集合进行操作.泛型方法将比我的示例代码中显示的更多,但这代表了我的问题的本质.
当我尝试以下操作时,我得到编译器错误"类型参数名称此时无效",并在CreateInstance()调用中指示参数T:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
return Activator.CreateInstance(T) as T;
}
Run Code Online (Sandbox Code Playgroud)
相反,我必须使用typeof(T)并将其传递给CreateInstance:
public CollectionBase GetInstance<T>() where T : CollectionBase
{
var targetType = typeof (T);
return Activator.CreateInstance(targetType) as T;
}
Run Code Online (Sandbox Code Playgroud)
没什么大不了的,但还有另一种方法可以声明我的GetInstance方法,这样我可以将T直接传递给Activator.CreateInstance(),就像在第一个examaple中一样吗?在这种情况下,我使用通用类型"T"接受了吗?
我想我的问题的本质是我假设T是一个实际的类型.但编译错误和需要调用typeof(T)似乎表明它是一个类型的名称.