我可以在运行时将类中的字段类型设置为 c# 中新创建的类型吗?

本文关键字:类型 新创建 创建 设置 运行时 我可以 字段 | 更新日期: 2023-09-27 18:33:47

我正在使用Reflection.EmitTypeBuilder在运行时创建一个新类型。我的设置是这样的:

public class MyClass {
    public object MyField = CreateInstanceOfNewType();
    public MyClass() {}
}

问题是MyClass.MyField是用类型 object 声明的,因此在将可强制转换类型分配给 MyClass.MyField 时,不会调用新类型存在的隐式强制转换运算符。有没有办法将字段的类型设置为新创建的类型,以便它的行为类似于典型情况下的行为?

我可以在运行时将类中的字段类型设置为 c# 中新创建的类型吗?

这取决于确切的用例,一个可能的解决方案是使你的类泛型,然后使用反射创建一个静态泛型方法来创建类的实例。这允许您在声明属性时使用变量动态类型:

public class MyClass<T> { 
public T MyField = CreateInstanceOfNewType<T≥(); 
public MyClass() {} 
}
public static MyClass<T> createClass<T>() {
return new MyClass<T>:
}
dynamic instanceOfMyClass = typeof(SomeClass).GetMethod("createClass").MakeGeneric(dynamicType).Invoke()

另一种选择是使用动态关键字。

如果我理解正确,您希望使用已为其构建隐式强制转换运算符的某种可铸造类型的对象初始化新类型的对象。我建议你考虑使用构造函数而不是隐式运算符:使用 Reflection.Emit 创建采用可转换类型的一个参数的构造函数,并使用该参数值初始化新类型的对象。您希望获得与这段代码相同的结果:

public class MyNewType
{
    public MyNewType(CastableType value)
    {
        /* implement initialization with value */
    }
    /* other stuff */
}

然后,可以使用Activator.CreateInstance(Type type, params object[] arguments)来使用该构造函数。下面是一个示例:

var newType = GetNewType();
var castableObject = CreateInstanceOfCastableType();
this.MyField = Activator.CreateInstance(newType, castableObject);