我想创建一个我在一个通用方法中指定的类型的实例.此类型具有许多重载的构造函数.我希望能够将参数传递给构造函数,但是
Activator.CreateInstance<T>()
并不认为这是一个选择.
还有另一种方法吗?
我正在努力提高应用程序的性能.我们有很多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>));
    }
我想知道为什么会这样,我所做的只是:
ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something"));
是否有更好的方法来创建有助于上述内容的对象?当你不确定具体的类型时,它有点难.
我需要一个性能增强的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) …我试图通过API创建一个对象,即我不需要表格,MyModel.new(:name => params[:name])或者我应该做什么MyModel.create(:name => params[:name])?
假设我resources : my_models在routes
我查了一下,我看到方法可以使用params hash ok.
这可以动态创建一个数组:
Assembly asm = object.GetType().Assembly;
string sTypeName = "Company.Namespace.ClassName";
object arrayWithSize1 = Activator.CreateInstance( asm.GetType(sTypeName), 1 );
但是如何设置上面创建的数组的第一个元素?
您好,有一个 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
我有另一个 C# 项目,它没有引用 vb6 项目,但需要使用它。我尝试过:
var iet = Type.GetTypeFromProgID("PROJVB6.CLASSVB6");
dynamic CalledProgram = Activator.CreateInstance(iet);
它有效。但是如果我尝试使用以下方法获取 ActualParameters 属性:
dynamic a = CalledProgram.ActualParameters(); 
我收到此错误:
指定的记录无法映射到托管值类。
我怎样才能访问ActualParameter以获取Codice或Numreg的设置值而不生成错误?
谢谢
是否可以创建和显示TForm而无需源文件?我想在运行时创建我的表单,并且空的*.dfm和*.pas文件对我来说似乎没用.
谢谢
我创建了一个引入实现接口的第三方插件(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";
    }
  }
}
两种方式(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!");
        }
    }
} …我现在拥有的(成功加载插件)是这样的:
Assembly myDLL = Assembly.LoadFrom("my.dll");
IMyClass myPluginObject = myDLL.CreateInstance("MyCorp.IMyClass") as IMyClass;
这仅适用于具有不带参数的构造函数的类.如何将参数传递给构造函数?
我正在使用以下代码访问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;
大多数情况下,它很有效.在很小的时间内(小于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)
我查找了错误代码,似乎表明该服务未注册.我很确定实际情况并非如此,因为调用会在一段时间后正常工作,并且CLSID由提供explorer.exe.
我很难过.什么可能导致Activator.CreateInstance失败,但很少?
createinstance ×10
c# ×7
activator ×2
com ×2
dynamic ×2
reflection ×2
.net ×1
api ×1
arguments ×1
arrays ×1
assemblies ×1
class ×1
delphi ×1
delphi-xe2 ×1
generics ×1
il ×1
new-operator ×1
parameters ×1
performance ×1
ruby ×1
tform ×1
vb6 ×1
winapi ×1
winforms ×1