3
我试图执行一个扩展方法,返回和T类型的对象,但我想基于一个头/细节动态泛型类型的T型动态。用动态类型调用通用扩展方法
这也许有点冗长......
using System;
using System.Collections.Generic;
namespace Blah
{
public interface IHeader
{
string Name { get; set; }
IDetail Detail { get; set; }
}
public interface IDetail
{
//Nothing the 'Real' implementation of this
//interface will have it's own properties.
}
public class GenericHeader : IHeader
{
public string Name { get; set; }
public IDetail Detail { get; set; }
}
public class RealHeader : GenericHeader
{
public new RealDetail Detail
{
get { return (RealDetail) base.Detail; }
set { base.Detail = value; }
}
}
public class RealDetail : IDetail
{
public string ThisImportantOnlyToRealDetail { get; set; }
}
public static class ExtensionHelpers
{
public static T ToObject<T>(this IDictionary<string, string> reader) where T : new()
{
//This maps the dictionary to Key Value Pairs of the Object's properties
//it then will return a object filled with the values
return new T();
}
}
public class MyRepo<THeader> where THeader : class, IHeader, new()
{
public THeader GetById(int ID)
{
THeader returnHeader = new THeader();
//Process to fill Header
var dictDetail = new Dictionary<string, string>();
//Process to fill Detail Dictionary
//Use extension method to create an Object
//based on Key Value Pairs from Dictionary
// !!!!!!!!!!!!!!!! This Is The Problem !!!!!!!!!!!!!!!!
// Can't use typeof for returnHeader.Detail, reflection?
returnHeader.Detail = dictDetail.ToObject<typeof(returnHeader.Detail)>();
return returnHeader;
}
}
public class Worker
{
public void DoWork()
{
var myRealRepo = new MyRepo<RealHeader>();
var myRealHeader = myRealRepo.GetById(123);
Console.WriteLine(myRealHeader.Detail.ThisImportantOnlyToRealDetail);
}
}
}
我有一个小问题,一直试图去反思,看看我是否可以修复它,但撞到一堵砖墙。 returnHeader.Detail为null,它无法从中获取'GetType()'。 –
这就是我提到的你设计的问题。你需要有一种方法来传达你想要的'Detail'属性的类型,因为只要它的值是'null',你知道的唯一类型就是'IDetail',这显然不能被实例化。也许你可以添加一个'Type DetailType {get; }'属性到'IHeader'接口,允许实现通知你他们想要使用什么类型? – Sven
不幸的是,我继承了这个项目,代码在其他程序集中使用。我通过在创建回购对象MyRepo期间传入类型来修复它,然后我可以将其转换为(TDetail)。 –