gpt4 book ai didi

c# - 通用构造函数和反射

转载 作者:太空狗 更新时间:2023-10-29 17:48:58 25 4
gpt4 key购买 nike

是否可以看出哪个构造函数是通用构造函数?

internal class Foo<T>
{
public Foo( T value ) {}
public Foo( string value ) {}
}

var constructors = typeof( Foo<string> ).GetConstructors();

属性“ContainsGenericParameters”为两个构造函数返回 false。有什么方法可以找出 constructors[0] 是通用的吗?它们都有相同的签名,但我想将“真正的”字符串称为一个。

编辑:

我想调用给定的类型使用

ilGen.Emit( OpCodes.Newobj, constructorInfo );

所以我需要使用绑定(bind)版本。但我想调用“最佳”构造函数。这应该是标准行为。当我打电话时

new Foo<string>()

调用具有字符串签名的构造函数(而不是具有通用签名的构造函数)。我的代码也会发生同样的情况。

最佳答案

您需要 System.Reflection.ParameterInfo.ParameterType.IsGenericParameter。这是一个通过的 VS2008 单元测试,说明了这一点:

类:

public class Foo<T>
{
public Foo(T val)
{
this.Value = val.ToString();
}
public Foo(string val)
{
this.Value = "--" + val + "--";
}

public string Value { get; set; }
}

测试方法:

Foo<string> f = new Foo<string>("hello");
Assert.AreEqual("--hello--", f.Value);

Foo<int> g = new Foo<int>(10);
Assert.AreEqual("10", g.Value);

Type t = typeof(Foo<string>);
t = t.GetGenericTypeDefinition();

Assert.AreEqual(2, t.GetConstructors().Length);

System.Reflection.ConstructorInfo c = t.GetConstructors()[0];
System.Reflection.ParameterInfo[] parms = c.GetParameters();
Assert.AreEqual(1, parms.Length);
Assert.IsTrue(parms[0].ParameterType.IsGenericParameter);

c = t.GetConstructors()[1];
parms = c.GetParameters();
Assert.AreEqual(1, parms.Length);
Assert.IsFalse(parms[0].ParameterType.IsGenericParameter);

这里值得注意的一点是 parms[0].ParameterType.IsGenericParameter 检查,它检查参数是否是通用的。

找到构造函数后,您就可以将 ConstructorInfo 传递给 Emit。

public System.Reflection.ConstructorInfo FindStringConstructor(Type t)
{
Type t2 = t.GetGenericTypeDefinition();

System.Reflection.ConstructorInfo[] cs = t2.GetConstructors();
for (int i = 0; i < cs.Length; i++)
{
if (cs[i].GetParameters()[0].ParameterType == typeof(string))
{
return t.GetConstructors()[i];
}
}

return null;
}

虽然不确定您的意图是什么。

关于c# - 通用构造函数和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/869395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com