0

我正在尝试将字典转换为接口的实现。

我可以得到一个对象的字典好吧。做这样的事情:

public static class ObjectExtensions
{
    public static T ToObject<T>(this IDictionary<string, object> source)
    where T : class, new()
    {
        var someObject = new T();
        var someObjectType = someObject.GetType();

        foreach (var item in source)
        {
            someObjectType.GetProperty(item.Key).SetValue(someObject, item.Value, null);
        }

        return someObject;
    }

    public static IDictionary<string, object> AsDictionary(this object source, BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
    {
        return source.GetType().GetProperties(bindingAttr).ToDictionary
        (
            propInfo => propInfo.Name,
            propInfo => propInfo.GetValue(source, null)
        );

    }
}

var dictionary = new Dictionary<string, object> {{"Prop1", "hello world!"}, {"Prop2", 3893}};
var someObject = dictionary.ToObject<A>();

但我希望能够:

var someObject = dictionary.ToObject<iA>();

任何人都知道如何做到这一点?

4

1 回答 1

1

您需要创建该接口的具体实现。您可以通过使用TypeBuilder 类来做到这一点。

或者,您可以使用动态类型和即兴

using ImpromptuInterface;
using ImpromptuInterface.Dynamic;

public interface IMyInterface
{
   string Prop1 { get;  }
}

//Anonymous Class
var anon = new {
         Prop1 = "Test",
}

var myInterface = anon.ActLike<IMyInterface>();

不过,我更喜欢 Amy 的解决方案。以上两种方法都复杂得多,但是它们可以在不强制调用者指定实际的具体类型的情况下完成。

于 2013-06-11T14:34:22.477 回答