标签: createinstance

Activator.CreateInstance 与工厂模式

和工厂有什么区别Activator.CreateInstance?它们可以互换使用吗?或者我们还需要工厂模式吗?

c# design-patterns factory createinstance

4
推荐指数
1
解决办法
8405
查看次数

参数来自参考时的GetMethod

我正在使用反射创建一个对象的实例,并在对象的类中获取方法,但是当我必须使用类型数组Type来避免歧义问题时,问题就来了,这里是我的代码示例我试图达到.

public class BigClass
{
    public void getSomething(XmlDocument doc, ref CustomObject obj) {...}
    public void getSomething(XmlDocument doc, ref CustomObject obj, string id) {...}
}
Run Code Online (Sandbox Code Playgroud)

此代码来自外部程序集(file.dll),我正在使用下一个代码.

Assembly a = Assembly.LoadFrom("file.dll");
Type s = a.GetType("FileNamespace.BigClass");
MethodInfo inf = s.GetMethod("getSomething", new [] {typeof(XmlDocument), typeof(CustomObject), typeof(string)});
Run Code Online (Sandbox Code Playgroud)

要获取MethodInfo使用3个参数的对象,但变量"inf"为空,我认为因为它没有找到使用"ref"的参数的方法.

有办法解决这个问题吗?

.net c# reflection createinstance getmethod

4
推荐指数
1
解决办法
658
查看次数

Pyomo 无法在构造之前迭代抽象 Set

我在 Pyomo 中构建了一个抽象模型,效果很好。

但是,当我尝试使用字典来实例化抽象模型时,出现以下错误“错误:为目标值生成表达式时规则失败:RuntimeError:在构造(初始化)之前无法迭代抽象集'I' .”

具体来说,问题如下:

    from pyomo.environ import *

    model = AbstractModel()
    model.D = Set()      
    model.I = Set()                            
    model.w = Param(model.D)                   
    model.S_0 = Param(model.D) 
    model.x = Var(real_model.I, model.D) 

    def sum_cubic(m):
        return sum(w[j]*(m.x[i][j]-m.S_0[j])**3 for i in model.I for j in model.D)
    
    model.value = Objective(rule = sum_cubic, sense = maximize)
    model.pprint()
Run Code Online (Sandbox Code Playgroud)

上面的代码运行得很好。但是当我在它后面添加以下代码时会出现错误,其中名称和 S_0 是预定义的字典:

    data = {None:{
    'D':{None: names},
    'I':{None: list(range(1,4))},
    'w':[0.3,0.3,0.4],
    'S_0':S_0,
    }
    }
    real_model = model.create_instance(data) 
Run Code Online (Sandbox Code Playgroud)

错误:为目标值生成表达式时规则失败:RuntimeError:无法在构造(初始化)之前迭代抽象集“I”。错误:从数据构建组件“值”=无失败:运行时错误:无法在构造(初始化)之前迭代抽象集“I”。

有人可以帮我吗?谢谢。

createinstance pyomo

4
推荐指数
1
解决办法
178
查看次数

如何修复Activator.CreateInstance失败与MissingMethodException"未找到类型的构造函数"?

我正在尝试使用以下内容创建自定义用户控件:

var panel = new GenericAccordionPanel<ZoneReport, ZonesPanel, ZonesVM>(myVm.ZonesVm);
Run Code Online (Sandbox Code Playgroud)

GenericAccordionPanel 定义为:

public class GenericAccordionPanel<THeader, TBody, TViewModel> : UserControl
{
    public Accordion Accordion { get; set; }

    public GenericAccordionPanel(TViewModel vmItem)
    {
        this.Accordion = new Accordion();

        //the constructor for ZoneReport(THeader) takes a ZonesVM (vmItem) as a parameter.
        var zr = (THeader)Activator.CreateInstance(typeof(THeader), new { vmItem });

        var exp = new Expander { Header = zr };

        Accordion.Children.Add(exp);

        base.Content = Accordion;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是Activator.CreateInstance失败的原因如下MissingMethodException:

找不到类型'[namespace] .Zones.ZoneReport'的构造函数.

我怎样才能创造出一种意志ZoneReport

c# wpf createinstance activator

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

Activator.CreateInstance 上的 TargetInvocationException

我在使用反射实例化 DLL 文件中定义的类时遇到了一些麻烦。尽管代码看起来不错,但我在 Activator.CreateInstance 上得到了 TargetInvocationException。代码如下(目前只有一个 DLL 可用):

public Comparator() 
{
    string[] filePaths = Directory.GetFiles(@".\Extensions");
    for (int i = 0; i < filePaths.Length; ++i)
    {
        var asm = Assembly.LoadFrom(Path.GetFullPath(filePaths[i]));

        if (asm != null)
        {
            foreach (Type currType in asm.ExportedTypes)
            {
                if (!currType.IsAbstract && currType.IsPublic && typeof(SorterBase).IsAssignableFrom(currType))
                {
                    Debug.WriteLine(currType); //outputs: BubbleSort.Sorter
                    var instance = Activator.CreateInstance(currType); //TargetInvocationException
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我试图实例化的类:

using SortingLibrary;
using SortingFunctions;
namespace BubbleSort
{
    public class Sorter : SorterBase //SorterBase is an abstract class defined in …
Run Code Online (Sandbox Code Playgroud)

c# createinstance activator targetinvocationexception

3
推荐指数
1
解决办法
2854
查看次数

c#Activator.CreateInstance不初始化变量

拥有Remember.cs:

namespace Tasks
{
    public class Remember : Task
    {
        new public string name = typeof(Remember).Name;
        new public Task.Priority priority = Task.Priority.High;
    }
}
Run Code Online (Sandbox Code Playgroud)

Task.cs:

public abstract class Task
{
    public string name;
    public Task.Priority priority = Task.Priority.Low;

    public enum Priority
    {
        High = 3,
        Medium = 2,
        Low = 1,
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下方法创建此类的实例时:

Task task = (Task)Activator.CreateInstance(typeof(Remember));
Debug.Log(task.name + " - " + task.priority);
Run Code Online (Sandbox Code Playgroud)

任务的名称为空,优先级是Task.Priority枚举中可用的最小数字而不是选定的数字(高).

为什么不Activator.CreateInstance初始化那些变量呢?

.net c# createinstance

3
推荐指数
1
解决办法
122
查看次数

Activator.CreateInstance(t,42,args)找不到构造函数

我在工厂模式样式函数中使用(稍微扩展版本)以下代码:

public class SingleItemNew : CheckoutContext { public BookingContext Data { get; set; } public SingleItemNew(BookingContext data) { Data = data; } } public CheckoutContext findContext(BookingContext data) { Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString()); CheckoutContext output = Activator.CreateInstance(contextType, BindingFlags.CreateInstance, new[] { data }) as CheckoutContext; return output; }

但是,它会在运行时抛出一个未发现异常的构造函数,我无法弄清楚原因.

data.Case.ToString()方法返回一个类的名称SingleItemNew,它具有一个带有单个参数的构造函数.

有谁知道问题是什么?

干杯,艾德

.net c# types createinstance activator

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

C#无法从'System.DateTime'转换为'object []'methodinfo.invoke

看起来我可能以错误的方式接近这个方向,而且方向非常受欢迎.

我试图Start在我的解决方案中触发所有方法.

Start方法采用日期时间

但是,当试图将日期作为"调用"的参数传递时,我遇到了错误

无法从System.DateTime转换为object []

欢迎任何想法

谢谢gws

scheduleDate = new DateTime(2010, 03, 11);

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "AssetConsultants");

foreach (Type t in typelist)
{
    var methodInfo = t.GetMethod("Start", new Type[] {typeof(DateTime)} );
    if (methodInfo == null) // the method doesn't exist
    {
       // throw some exception
    }

    var o = Activator.CreateInstance(t);                 
    methodInfo.Invoke(o, scheduleDate);
}
Run Code Online (Sandbox Code Playgroud)

c# datetime createinstance invoke

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

如何在C#中实例化IDispatchEx?

这是我的第一个问题!我想实例化一个COM对象并将其转换为IDispatchEx,以便我可以枚举其成员.这是一个例子:

    Type _COMType = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
    var _COMObject = (IDispatchEx)Activator.CreateInstance(_COMType);

我的IDispatchEx与本网站(不是我的网站)上的相同,只是GetNextDispID和GetMemberName返回一个int(我希望用于MSDN上描述的HRESULT ).

上面的例子不起作用.有没有办法实例化COM对象,就像从Active Scripting转换为IDispatchEx接口一样?

感谢您提供的所有帮助/建议!

c# com activex createinstance

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

在重新分配CreateInstance之前需要释放com_ptr_t吗?

在具有_com_ptr_t成员的C++类中,如果在同一指针上重复使用CreateInstance()以获取COM对象的新实例,而不首先执行Release(),则内存是否会泄漏?有充分证据表明,当其中一个智能指针超出范围时,ref计数会减少,而当封装指针是Detach()时则不会减少.MSDN似乎没有提到重复CreateInstance()时引用计数的含义.

c++ smart-pointers createinstance

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

C# Activator createInstance 用于扩展类

我有一个基类,如下所示:

public Data()
    {
        id = num++;
        SetVariables();
    }
    //fill every Variable varNames, parseInduction, noise, seperator in Children Classes
    public Data(String line)
    {
        //first declare all variables in sub classes
        if (id == 0)
            throw new NotSupportedException("You are not allowed to use this constructor for creating the first instance!");
        id = num++;
        SetVariables();
        parseLine(line);
    }
Run Code Online (Sandbox Code Playgroud)

而且我还有一个扩展这个类的子类。

class DienstGruppe : Data
{
    protected override void SetVariables(){
        varNames = new String[] {"id", "name"};
        parseInduction = "DienstGruppen = {";
        parseEnd = "};";
        beginOfDataLine …
Run Code Online (Sandbox Code Playgroud)

c# inheritance createinstance activator extending

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

如何创建存储在对象变量中的对象的新默认实例?

下面的例子显示了意图。该示例迭代对象数组,并创建一个具有加载默认值的相同类型的数组。值本身不需要从一个列表复制到下一个列表。这是列表的“类型克隆”。

下面的代码会为激活器产生以下错误:

“System.Int32 不是 GenericTypeDefinition。MakeGenericType 只能在 Type.IsGenericTypeDefinition 为 true 的类型上调用。”

Activator、CreateInstance 和 MakeGenericType 的细节对我来说仍然有点混乱。

如何更改代码以避免错误?

任何建议,将不胜感激。

    private void Test()
    {
        object[] a = new object[] {100, "Text", new clsMyClass()};
        object[] b = new object[a.Length];

        for (int i = 0; i < a.Length; i++)
        {
            b[i] = Activator.CreateInstance(a[i].GetType().MakeGenericType());
        }

        for (int i = 0; i < b.Length; i++)
        {
            Console.WriteLine(b[i].GetType().ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

预期输出为:

  • 系统.Int32
  • 系统字符串
  • MyNamespace.clsMyClass

结果值将是:

  • b[0] = 0
  • b[1]=“”
  • b[2] = 新的 clsMyClass

c# default object createinstance

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

创建实例并调用程序集的静态Main

我在创建静态void Main()的程序集实例时遇到问题.

Heres是程序集的代码(.NET Exe)

namespace Test
{ 
    internal static class Program
    {

        [STAThread]
        private static void Main(string[] args)
Run Code Online (Sandbox Code Playgroud)

这是启动器代码:bin是一个包含从文件读取的程序集的字节数组.

Assembly asm = Assembly.Load(bin); 
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)

由于参数不匹配,obj始终为null并且Invoke抛出异常.

c# createinstance invoke .net-assembly

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