簡體   English   中英

通過具有匿名類型的反射實例化對象

[英]Instantiate object via reflection with anonymous type

我正在使用以下方法通過反射實例化對象

 Activator.CreateInstance(Type type, params object[] parameters)

其中“參數”是在運行時傳遞給構造函數的參數列表。

但是,我希望此過程對團隊中的其他開發人員來說更加直觀,而不是傳遞object []參數數組,而是希望他們傳遞匿名對象,例如

 // note, invalid code
 Activator.CreateInstance(typeof(MyType), new { paramName1 = "abc", paramName2 = "xyz})

由於framework方法不支持它,因此有人可以將匿名對象轉換為數組的代碼示例嗎? 請注意,參數的順序對於Activator.CreateInstance()方法很重要,因為這就是參數匹配的方式。 顯然,這很容易出錯,這就是為什么我更喜歡使用匿名類型的原因。

任何建議都將不勝感激。

亞歷克

我不會為此使用Activator.CreateInstance 我將使用Type.GetConstructors()來獲取所有構造函數,然后查找與匿名類型具有屬性且名稱相同的參數數量相同的參數。 如果可能有多個具有不同類型的此類構造函數,則需要添加額外的邏輯以檢查每種參數類型是否與相關的屬性類型兼容。

就像是:

public object CreateInstance(Type type, Object parameterMapping)
{
    var ctors = type.GetConstructors();
    var properties = parameterMapping.GetType().GetProperties();
    foreach (var ctor in ctors)
    {
        var parameters = ctor.GetParameters();
        if (parameters.Length != properties.Length)
        {
            continue;
        }
        object[] args = new object[parameters.Length];
        bool success = true;
        for (int i = 0; i < parameters.Length; 
        {
            var property = parameterMapping.GetType().GetProperty(parameter.Name);
            if (property == null)
            {
                success = false;
                break;
            }
            // TODO: Check property type is appropriate too
            args[i] = property.GetValue(parameterMapping, null);
        }
        if (!success)
        {
            continue;
        }
        return ctor.Invoke(args);
    }
    throw new ArgumentException("No suitable constructor found");
}

暫無
暫無

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

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