我在工厂模式样式函数中使用(稍微扩展版本)以下代码:
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,它具有一个带有单个参数的构造函数.
有谁知道问题是什么?
干杯,艾德
我正在尝试创建具有相同基类型的对象实例,如下所示:
Assembly myAssembly = Assembly.GetExecutingAssembly();
var objs = myAssembly.GetTypes().Where(t => t.BaseType == typeof(SearchLogicObjectBase)).OrderBy(o => o.FullName);
foreach (var item in objs)
{
SearchLogicObjectBase p = (SearchLogicObjectBase)Activator.CreateInstance(item.GetType(), new Object[] { false });
_searchlogic.AddDefaultSearchObject(p);
}
Run Code Online (Sandbox Code Playgroud)
派生对象具有如下构造函数:
public SearchLogicCsri()
: this(true)
{ }
public SearchLogicCsri(bool extendsearch)
: base(extendsearch)
{
Table = "csri";
ViewModel = "CsriViewModel";
ExtendSearch = extendsearch;
}
Run Code Online (Sandbox Code Playgroud)
并且基础对象(SearchLogicObjectBase)有一个这样的构造函数:
public SearchLogicObjectBase(bool extendsearch)
{
_extendsearch = extendsearch;
}
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码导致以下异常:
找不到类型为"System.RuntimeType"的构造函数.
基类和派生类型都有一个构造函数,它只需要一个布尔值,所以我不知道为什么我会得到错误.
有人可以帮忙吗?
我试图动态加载.DLL文件并运行其中一个方法(实际上只有一个方法..)但Activator.CreateInstance方法删除"无法创建一个抽象类"异常这是我的代码:
Assembly assembly = Assembly.Load(DLLByteArray);
//Type typeToExecute = assembly.GetType("ClassLibrary1.Class1");
//last line was replaced with the next one to ensure that the name is correct.
Type typeToExecute = assembly.GetTypes()[0];
Object instance = Activator.CreateInstance(typeToExecute);
Run Code Online (Sandbox Code Playgroud)
如果需要,减速等级:" public static unsafe class Class1".
.DLL类代码中的任何内容都可能导致此类异常吗?
假设我们有一些课程
class Class1{ }
class Class2{ }
class Class3{ }
Run Code Online (Sandbox Code Playgroud)
我有一个Type变量
Type t = /*some type unknown at compile-time*/;
Run Code Online (Sandbox Code Playgroud)
变量t是Class1或Class2或Class3.我想创建该类的实例.据我所知,我可以使用以下声明:
object instance = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个对象.问题是:如何将此对象转换为变量类型t.或maby有人可以建议一个解决方法.谢谢
我正在尝试创建一个类的实例,我可以通用方式添加到列表中.
我知道type这需要量身定做的,我已经能够使一个类的object使用下面的代码之类的,但我还没有找到一种方法来创建一个施法,让我这个添加到列表中..任何想法?
T与objType相同
public static List<T> LoadList(string fileName, Type objType)
{
List<T> objList = new List<T>();
object o = Activator.CreateInstance(objType);
objList.Add((**o.GetType()**)o);
return objList;
}
Run Code Online (Sandbox Code Playgroud)
如果这是一个更好的方式这样做我也开放的想法:)
我有一个我正在研究的项目,我想利用Activator.createInstance,以便我可以动态地从XML中提取类名.这些类必须根据其功能订阅两个接口中的至少一个.我的问题是,当我使用Activator.CreateInstance时,告诉我实例化的类订阅哪个接口的最佳方法是什么?我应该把演员包裹在试试中吗?看起来好像很慢.也许我应该把它转换为obj然后调用GetType并将其与我的接口名称进行比较?任何帮助表示赞赏!
我的应用程序中有一个当前程序集,我想从外部cs文件中添加一个类到此程序集中.有可能吗?我想像插件一样使用它.现在我正在尝试使用:
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
Run Code Online (Sandbox Code Playgroud)
和Activator,但没有成功.我的应用程序是使用Roslyn,所以也许它可以做到.任何想法将不胜感激.
编辑:下一个问题是:我可以使用外部文件(带有类的cs文件)从该文件中获取实例,但类的构造函数需要从当前的程序集引用sceneManager.那么可以向Roslyn发送类似的东西并从中获取类的实例吗?
下面的代码不起作用,我想知道如何将实例动态转换为在运行时确定的类型?
Convert.ChangeType()返回仍然需要转换的Object。调用Invoke(),GetConstructor()或Activator.CreateInstance()的所有尝试也是如此,请参见下文。在某个时候,我需要显式地强制转换代码,我希望避免它或将其尽可能地推出。
Type type = Type.GetType ("RandomChildClass");
Object obj = Activator.CreateInstance (type, new Object[]{ "argument" });
var instance = (type)obj;
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建一个接受<T>的方法,但是仍然会有一个不知道如何使用动态随机类型调用它的问题,即 使用Type变量强制转换变量
我有一个泛型类,它有一个泛型方法,它使用与实例化对象时传递的类型相同的类型.在运行时,我只知道我需要通过该对象名的字符串表示传入的对象的名称.我已经阅读了一些关于使用Activator和可能使用动态的东西,但我无法理解我需要如何使用它.这是我的泛型类的样子片段:
public class MyClass<T> where T : class, new()
{
public IList<T> MyMethod(Stream stream)
{
var data = new List<T>();
// stuff to create my list of objects
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要根据我作为字符串传入的对象的名称从MyMethod()方法返回我的IList.
我只是做一个开关/箱的字符串,然后与参考"真正的"对象的情况中实例的MyClass的,但我不知道是否有这样做的更好(更短和更清洁的)的方式.
TIA
我正在使用Activator.CreateInstance类型变量创建对象(在运行时未知):
static dynamic CreateFoo( Type t ) =>
Activator.CreateInstance( t );
Run Code Online (Sandbox Code Playgroud)
显然,我还没有正确理解如何使用该dynamic类型,因为这仍然只是返回一个对象.
我需要能够将一个集合传递给另一个调用,Activator.CreateInstance在那里创建的类型可能是List<T>:
var values = Enumerable.Range( 1, 50 ).Select(
I => CreateFoo( typeof( Foo ) ) ).ToArray( );
//This will explode.
var foobar = Activator.CreateInstance(
typeof( List<Foo> ), values );
Run Code Online (Sandbox Code Playgroud)
调用上面的内容时,它会爆炸,但会出现以下异常:
我明白为什么它这样做 - 当列表使用类型参数定义时,没有列表的构造函数期望可枚举的对象.
问题是我无法转换对象,因为我不知道运行时的类型.Activator.CreateInstance只是似乎返回一个对象,这对List<Foo>我来说很好,因为我将使用依赖对象和属性设置它们,所以盒装对象对他们来说完全没问题,但在尝试创建列表时会破坏一切(可能还有什么否则与构造函数期望类型参数).
我想在这里做什么的正确方法是什么?
符合最小,完整和可验证的示例要求:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MCVEConsole {
class Program {
static int Main( string[ ] args …Run Code Online (Sandbox Code Playgroud)