簡體   English   中英

來自字符串類型名稱的強類型對象(C#)

[英]Strongly typed object from string type name (C#)

如果你看看下面的代碼,你(希望)會看到我想要實現的目標。 基本上這段代碼可以:

  • 對通用storag項的查詢(它們將其類型存儲為字符串)
  • 如果該項是SearchCriteria的子類,請創建正確的實例
  • 將實例添加到列表中(SearchCriteria是超類)

當然,不是很優雅的偽開關案例,我必須根據我創建的所有不同標准進行更新。

所以,我的問題是,是否有一種“通用”方法來創建一個強類型的實例,使用字符串作為類型的“源”。

我知道我可以使用Reflection來創建一個實例,但這是一個對象類型,所以我無法將它添加到列表中。 哦,只是有了一個想法...使用反射創建對象,將其強制轉換為超類型(SearchCrit),添加到列表中。 真正的類型應該仍然是“正確的子類型”我希望...

將嘗試它,並用結果更新這篇文章。 有更好的想法嗎?

克里斯

   private IList<SearchCriteria> _searchCriteriaAll;
    public IList<SearchCriteria> SearchCriteriaAll
    {
        get
        {
            if (_searchCriteriaAll == null)
            {
                _searchCriteriaAll = new List<SearchCriteria>();
                var tN = typeof (SearchCriteria).ToString();
                foreach (var o in DataStorage.LinkedObjects)
                {
                    if (tN.StartsWith(o.TypeName))
                    {
                        if (o.TypeName == typeof(StringSearchCriteria).ToString())
                            _searchCriteriaAll.Add(new StringSearchCriteria(o));
                    }
                }
            }
            return _searchCriteriaAll;
        }
    }

編輯:

感謝您的提示,“正確”的方式肯定是工廠模式。 我會調查一下。 現在,我使用這個hack,因為子類太小了,我不想為每一個工廠......(而這個地方目前是唯一一個有這種“花哨”功能的地方)

   private IList<SearchCriteria> _searchCriteriaAll;
    public IList<SearchCriteria> SearchCriteriaAll
    {
        get
        {
            if (_searchCriteriaAll == null)
            {
                _searchCriteriaAll = new List<SearchCriteria>();
                var tN = typeof (SearchCriteria).ToString();
                foreach (var o in DataStorage.LinkedObjects)
                {
                    if (tN.StartsWith(o.TypeName))
                    {
                        var newO = Activator.CreateInstance(typeof(SearchCriteria).Assembly.FullName, o.TypeName);
                        var newCrit = newO.Unwrap() as SearchCriteria;
                        newCrit.DataStorage = o;
                        _searchCriteriaAll.Add(newCrit);
                    }
                }
            }
            return _searchCriteriaAll;
        }
    }

泛型和反思不會成為好朋友。 這里更簡單的方法是使用非通用列表接口:

_searchCriteriaAll = new List<SearchCriteria>();
IList list = (IList) _searchCriteriaAll;
...
Type type = typeof(SearchCriteria).Assembly.GetType(o.TypeName);
list.Add(Activator.CreateInstance(type));

(其中o.TypeName包含命名空間信息,但不必是程序集限定的)

這仍然是運行時類型安全的(如果它是錯誤的,它將在運行時拋出),並仍然調整相同的列表。

另請注意,我們只通過Assembly.GetType()直接查看Assembly內部。

我會說你正在尋找工廠方法模式

有一個C#示例這里 -第一個鏈接解釋模式更好,第二個是你正確的語言。

我並不完全清楚你想要實現什么,但你可以從這樣的字符串創建一個Type:

var t = Type.GetType(typeName);

如果要檢查它是否是正確的子類型,可以使用IsAssignableFrom方法。

C# 強類型ConfigurationBuilder列表<object>從應用設置<div id="text_translate"><p>真的在為這個苦苦掙扎——它應該這么難嗎?!</p><p> 我的 appsettings 中有一個簡單的 object 數組:</p><pre> "AppSettings": { "Names": [ { "Id": "1", "Name": "Mike" }, { "Id": "2", "Name": "John" } ] }</pre><p> 然后我有一個 class</p><pre> public class AppSettings { public List&lt;Names&gt; Names { get; set; } = new List&lt;Names&gt;(); } public class Names { public string Id { get; set; } public string Name { get; set; } }</pre><p> 我在我的應用設置中讀到:</p><pre> var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appSettings.json").Build(); var config = new AppSettings();</pre><p> 這就是出錯的地方:</p><pre> config.Names = configuration.GetSection("AppSettings:Names") //&lt;&lt;&lt;&lt; what do I do here?</pre><p> 似乎它都與IConfigurationSection相關,這沒有幫助。</p></div></object>

[英]C# strongly typed ConfigurationBuilder List<object> from appsettings

暫無
暫無

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

相關問題 從以 ID 為名稱的 json 對象創建一個強類型的 c# 對象 使用 C# 從強類型類動態構建對象? 從通用(C#)創建強類型對象時發生編譯錯誤 如何使用C#從xml獲取強類型對象? C# 強類型ConfigurationBuilder列表<object>從應用設置<div id="text_translate"><p>真的在為這個苦苦掙扎——它應該這么難嗎?!</p><p> 我的 appsettings 中有一個簡單的 object 數組:</p><pre> "AppSettings": { "Names": [ { "Id": "1", "Name": "Mike" }, { "Id": "2", "Name": "John" } ] }</pre><p> 然后我有一個 class</p><pre> public class AppSettings { public List&lt;Names&gt; Names { get; set; } = new List&lt;Names&gt;(); } public class Names { public string Id { get; set; } public string Name { get; set; } }</pre><p> 我在我的應用設置中讀到:</p><pre> var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appSettings.json").Build(); var config = new AppSettings();</pre><p> 這就是出錯的地方:</p><pre> config.Names = configuration.GetSection("AppSettings:Names") //&lt;&lt;&lt;&lt; what do I do here?</pre><p> 似乎它都與IConfigurationSection相關,這沒有幫助。</p></div></object> C#6名稱空間為強類型名稱空間引用中的字符串 C# 中的字符串格式,用於強類型視圖 按類型還是類型字符串來強類型化Azure移動服務表對象? C# 強類型屬性 c#如何dapperRow到網格視圖中顯示的強類型對象
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM