繁体   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