标签: createinstance

如何将参数传递给Activator.CreateInstance <T>()

我想创建一个我在一个通用方法中指定的类型的实例.此类型具有许多重载的构造函数.我希望能够将参数传递给构造函数,但是

Activator.CreateInstance<T>()
Run Code Online (Sandbox Code Playgroud)

并不认为这是一个选择.

还有另一种方法吗?

c# generics createinstance

216
推荐指数
4
解决办法
13万
查看次数

快速创建对象而不是Activator.CreateInstance(type)

我正在努力提高应用程序的性能.我们有很多Activator.CreateInstance调用引起了一些悲伤.

我们基于一个接口(ITabDocument)实例化了很多类,在浏览后我想到了使用这段代码:

代码并不比使用我们拥有的Activator.CreateInstance代码更好(实际上稍慢).

    public static Func<T> CreateInstance<T>(Type objType) where T : class, new()
    {
        var dynMethod = new DynamicMethod("DM$OBJ_FACTORY_" + objType.Name, objType, null, objType);
        ILGenerator ilGen = dynMethod.GetILGenerator();
        ilGen.Emit(OpCodes.Newobj, objType.GetConstructor(Type.EmptyTypes));
        ilGen.Emit(OpCodes.Ret);
        return (Func<T>)dynMethod.CreateDelegate(typeof(Func<T>));
    }
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样,我所做的只是:

ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something"));
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来创建有助于上述内容的对象?当你不确定具体的类型时,它有点难.

c# reflection reflection.emit createinstance activator

31
推荐指数
4
解决办法
3万
查看次数

如何在Activator.CreateInstance中传递ctor args或使用IL?

我需要一个性能增强的Activator.CreateInstance()并且Miron Abramson发现了这篇文章,它使用工厂在IL中创建实例然后缓存它.(我已经在Miron Abramson的网站上包含了以下代码,以防它以某种方式消失).我是IL Emit代码的新手,除了Activator.CreateInstance()之外的任何东西,用于实例化一个类,任何帮助都会非常感激.

我的问题是我需要创建一个带有参数的ctor对象的实例.我看到有一种传递参数类型的方法,但有没有办法传入ctor参数的值?

如果可能的话,我想使用类似于CreateObjectFactory<T>(params object[] constructorParams)我想要实例化的某些对象的方法可能有超过1个ctor param.


// Source: http://mironabramson.com/blog/post/2008/08/Fast-version-of-the-ActivatorCreateInstance-method-using-IL.aspx
public static class FastObjectFactory
{
    private static readonly Hashtable creatorCache = Hashtable.Synchronized(new Hashtable());
    private readonly static Type coType = typeof(CreateObject);
    public delegate object CreateObject();

    /// 
    /// Create an object that will used as a 'factory' to the specified type T 
   /// 
    public static CreateObject CreateObjectFactory() where T : class
    {
        Type t = typeof(T);
        FastObjectFactory.CreateObject c = creatorCache[t] as FastObjectFactory.CreateObject;
        if (c == null) …
Run Code Online (Sandbox Code Playgroud)

.net parameters performance il createinstance

11
推荐指数
2
解决办法
2万
查看次数

ruby on rails,创建新对象,使用create或new方法?

我试图通过API创建一个对象,即我不需要表格,MyModel.new(:name => params[:name])或者我应该做什么MyModel.create(:name => params[:name])

假设我resources : my_modelsroutes

我查了一下,我看到方法可以使用params hash ok.

ruby api ruby-on-rails createinstance new-operator

10
推荐指数
1
解决办法
2万
查看次数

动态创建数组并设置元素

这可以动态创建一个数组:

Assembly asm = object.GetType().Assembly;
string sTypeName = "Company.Namespace.ClassName";
object arrayWithSize1 = Activator.CreateInstance( asm.GetType(sTypeName), 1 );
Run Code Online (Sandbox Code Playgroud)

但是如何设置上面创建的数组的第一个元素?

c# arrays reflection createinstance activator

8
推荐指数
2
解决办法
9159
查看次数

指定的记录无法映射到托管值类

您好,有一个 vb6 项目“PROJVB6”,其类“CLASSVB6”包含以下内容:

...

Public Type ActualParametersType_DOCUMENTI
    Codice As Variant
    Numreg As Variant
End Type
...
Private Gvar_ActualParameters           As ActualParametersType_DOCUMENTI
...
Public Property Let ActualParameters(RHS As ActualParametersType_DOCUMENTI)
    On Error Resume Next

    Gvar_ActualParameters = RHS
End Property
Public Property Get ActualParameters() As ActualParametersType_DOCUMENTI
    On Error Resume Next
    ActualParameters = Gvar_ActualParameters
End Property
Run Code Online (Sandbox Code Playgroud)

我有另一个 C# 项目,它没有引用 vb6 项目,但需要使用它。我尝试过:

var iet = Type.GetTypeFromProgID("PROJVB6.CLASSVB6");
dynamic CalledProgram = Activator.CreateInstance(iet);
Run Code Online (Sandbox Code Playgroud)

它有效。但是如果我尝试使用以下方法获取 ActualParameters 属性:

dynamic a = CalledProgram.ActualParameters(); 
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

指定的记录无法映射到托管值类。

我怎样才能访问ActualParameter以获取Codice或Numreg的设置值而不生成错误?

谢谢

c# vb6 com dynamic createinstance

7
推荐指数
1
解决办法
513
查看次数

是否可以在没有*.dfm和*.pas文件的情况下动态创建表单?

是否可以创建和显示TForm而无需源文件?我想在运行时创建我的表单,并且空的*.dfm和*.pas文件对我来说似乎没用.

谢谢

delphi dynamic createinstance tform delphi-xe2

6
推荐指数
1
解决办法
4440
查看次数

是否可以在不运行类中的任何代码的情况下创建类的实例?(没有ctor,没有字段初始化)

我创建了一个引入实现接口的第三方插件(DLL)的引擎.

由于我无法控制插入的代码,我希望能够从正确的类(GetTypes循环直到我找到接口类)运行1个特定方法(来自接口).

由于任何人都可以创建在Activator.CreateInstance上执行的优秀构造函数代码,我可以通过使用FormatterServices.GetUninitializedObject来解决这个问题.但是,当在类中的字段上初始化代码时,这无济于事.

public class myclass : myinterface {

  public someotherclass name = new someotherclass()

  public myclass() {
     //Unknown code
  }

  //I only want this run.
  public string MyProperty{
    get {
      return "ANiceConstString";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

两种方式(CreateInstance/GetUninitializedObject)的问题是将运行someotherclass的构造函数.

在开始分析我的需求之前.这仅在初始化引擎时运行以获得一组标准值.如果此get'er依赖于其他初始化值,则"插件"将被标记为失败,因为没有返回有效值.如果没有标记为失败,则稍后将使用Activator.CreateInstance()正确加载该类.

所以坚持这个问题:.Net是否支持任何创建100%非初始化类的方法?

更新答案.我在发布问题之前对此进行了测试.

对于某个其他类不会运行的答案,我已经测试了它,并且它是静态运行的.

public class myclass : myinterface {

    static Tutle test;

    public myclass () {
         test = new Tutle();
    }

    public class Tutle {
        public Tutle() {
            MessageBox.Show("RUN!");
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# initialization class createinstance

6
推荐指数
2
解决办法
1612
查看次数

如何将参数传递给通过Assembly.CreateInstance加载的C#插件?

我现在拥有的(成功加载插件)是这样的:

Assembly myDLL = Assembly.LoadFrom("my.dll");
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass;
Run Code Online (Sandbox Code Playgroud)

这仅适用于具有不带参数的构造函数的类.如何将参数传递给构造函数?

c# arguments assemblies createinstance

5
推荐指数
1
解决办法
9747
查看次数

为什么我对Activator.CreateInstance的调用会间歇性地失败?

我正在使用以下代码访问Windows资源管理器Shell的乐队网站服务:

Guid GUID_TrayBandSiteService = new Guid(0xF60AD0A0, 0xE5E1, 0x45cb, 0xB5, 0x1A, 0xE1, 0x5B, 0x9F, 0x8B, 0x29, 0x34);
Type shellTrayBandSiteService = Type.GetTypeFromCLSID(GUID_TrayBandSiteService, true);
site = Activator.CreateInstance(shellTrayBandSiteService) as IBandSite;
Run Code Online (Sandbox Code Playgroud)

大多数情况下,它很有效.在很小的时间内(小于1%),对Activator.CreateInstance的调用会引发以下异常:

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {F60AD0A0-E5E1-45CB-B51A-E15B9F8B2934} failed due to the following error: 80040154.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)
Run Code Online (Sandbox Code Playgroud)

我查找了错误代码,似乎表明该服务未注册.我很确定实际情况并非如此,因为调用会在一段时间后正常工作,并且CLSID由提供explorer.exe.

我很难过.什么可能导致Activator.CreateInstance失败,但很少?

c# com winapi createinstance winforms

5
推荐指数
1
解决办法
2353
查看次数