C# CF2.0 - System.Activator 和内部类

发布于 2024-07-21 06:25:29 字数 575 浏览 18 评论 0原文

我有一个包含实体集合的数据提供程序。 我只希望能够通过数据提供者创建一个新实体。

即,要创建一个新记录,我需要使用:

Entity entity = Provider.AddNew();
enity.set_Properties... etc

我的问题是,如果我将实体设置为“内部”,则 System.Activator 无法创建它们的实例。 我的每个数据提供程序都使用带有传递的实体的通用类型的基类。

因此,目前我的 AddNew() 方法包含以下内容:

public T AddNew()
{
  T added = Activator.CreateInstance<T>();
  this.Collection.Add(added);
  return added;
}

如果我可以在数据提供程序命名空间之外手动实例化一个新实体,这显然不是世界末日,但考虑到无法保存它们,这似乎毫无意义,所以为什么要提供这样做的选择?

编辑:忘记提及我的所有提供者、实体等都位于同一命名空间中。

I've got a data provider that contains a collection of entities. I only want to be able to create a new entity through the data provider.

I.e, to create a new record I need to use:

Entity entity = Provider.AddNew();
enity.set_Properties... etc

My issue is that if I set my entities to Internal, System.Activator cannot create an Instance of them. Each of my Data Providers uses a Base class with the generic type of the entity passed through.

So at the moment my AddNew() method contains the following:

public T AddNew()
{
  T added = Activator.CreateInstance<T>();
  this.Collection.Add(added);
  return added;
}

It's obviously not the end of the world if I can instantiate a new entity manually outside of the Data Provider namespaces, but it seems pointless considering there's no way to ever save them, so why give the option to do so?

EDIT: Forgot to mention that all my providers, entities, etc are in the same namespace.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘香 2024-07-28 06:25:29

不要使用激活器,它依赖于公共构造函数。 而是使用反射来查找无参数构造函数,然后调用它。 沿着这些思路:

Type t = typeof(MyType);
var parameterlessCtor = (from c in t.GetConstructors(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    where c.GetParameters().Length == 0
    select c).FirstOrDefault;
if(parameterlessCtor != null) instance = parameterlessCtor.Invoke(null);

Don't use the Activator, which relies on a public constructor. Instead use reflection to find the parameterless constructor and then call it. Something along these lines:

Type t = typeof(MyType);
var parameterlessCtor = (from c in t.GetConstructors(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    where c.GetParameters().Length == 0
    select c).FirstOrDefault;
if(parameterlessCtor != null) instance = parameterlessCtor.Invoke(null);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文