簡體   English   中英

C#動態類型初始化程序

[英]C# Dynamic Type Initializer

我正在嘗試動態構建類似C#type initalizer的東西:

MyClass class = new MyClass { MyStringProperty= inputString };

我想構建一個泛型方法,它反映一次給定的類型並返回一個委托,該委托創建一個新的類實例並根據輸入參數填充它。 方法簽名可能如下所示:

Func<string,T> CreateFunc<T>();

並且調用結果函數將創建一個新的'T'實例,其中(例如)具有String類型的每個公共屬性為輸入字符串參數的值。

因此,假設'MyClass'只有MyStringProperty,下面的代碼在功能上等同於開頭的代碼:

var func = CreateFunc<MyClass>();
func.Invoke(inputString);

我對System.Reflection和System.Linq.Expressions命名空間非常熟悉,過去我做過一些像這樣的中等復雜的事情,但這個讓我很難過。 我想構建一個已編譯的委托,而不是簡單地使用反射遍歷屬性。

謝謝!

在CLR 4.0中,您將能夠使用表達式構建完整的語句。

在那之前,你正在尋找一個代碼生成工作。 原型化最快的方法是在StringBuilder中構建C#然后在其上調用編譯器。 通過緩存,它可以正常運行。

這樣做的核心方法是生成IL並使用Reflection Emit構建方法,從而避免調用編譯器。

呃,是的,所以我只是讓事情變得太復雜了。 這是我正在尋找的方法:

public static Func<string, T> CreateFunc<T>()
    where T : class
{
    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty);
    var param = Expression.Parameter(typeof(string),"o");
    var constructorInfo = typeof(T).GetConstructor(new Type[] { });
    List<MemberBinding> bindings = new List<MemberBinding>();
    foreach (var property in properties)
        bindings.Add(Expression.Bind(property, param));

    var memberInit = Expression.MemberInit(Expression.New(constructorInfo), bindings);

    var func = Expression.Lambda<Func<string, T>>(memberInit, new ParameterExpression[] {param}).Compile();

    return func;            
}

不幸的是,我沒有看到這種情況發生,雖然我不是專家,因為你可以用表達式和代表做深刻的vodoo。

我看到它的方式,你只能通過反射來做到這一點。 如果沒有反射,您需要在編譯時知道要設置的每個屬性的名稱。 您可以為要支持的每個單獨的類執行單獨的功能,但這似乎與通用的,一刀切的功能的要求相反。

我可以問一下為什么功能在第一位? 某種形式的依賴注入?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM