有没有比使用原始反射更好的方法来利用“对象”上的隐式类型转换运算符?
Is there a better way to leverage an implicit type conversion operator on an `object` than using raw reflection?
假设你有一个 class Foo
:
public class Foo
{
public static implicit operator Foo(string s)
{
return new Foo();
}
}
如果您尝试以通常的方式利用此运算符,它当然可以正常工作:
var s = "foo";
Foo foo = s;
但是如果您有操作数 (s
) 但您 仅 将其作为 object
:
怎么办
object s = "foo";
Foo foo = s;
由于不存在从 object
到 Foo
的隐式转换,因此失败的原因很明显。但是,实例 是 和 string
并且类型转换运算符确实存在于这种情况下。出于这个问题的目的,假设所讨论的变量 (s
) 可以是多种类型中的任何一种,这些类型可能定义了类型转换运算符来执行请求的转换。
如果你愿意,你可以使用反射:
object s = "foo";
var converter = typeof(Foo)
.GetMethods()
.Single(x =>
x.Name == "op_Implicit" &&
x.ReturnType == typeof(Foo) &&
x.GetParameters().Single().ParameterType == typeof(string));
Foo foo = (Foo)converter.Invoke(null, new[] { s });
我尝试使用 Convert.ChangeType(s, typeof(Foo));
,但这不起作用。 有没有更好的选择或者使用反射是最好的选择?(出于标准原因,我对使用反射不满意——它可能没有最大限度地提高性能,而且代码的外观也不合时宜.但如果这是最好的选择,那很好。)
I'm unhappy with using reflection for the standard reasons -- it's probably not maximally performant
所需信息在 运行 时间之前根本不可用,因此您无法避免在 运行 时间确定该信息。这意味着反思。
您可以根据您的使用情况优化您的反射:如果您经常需要完全相同的转换,并且您需要转换的类型很少,您可以创建一个 Dictionary<Type, Func<object, Foo>>
。为特定类型创建一次DynamicMethod
,创建一个委托,并一遍又一遍地调用它。或者,如果动态方法的设置增加的时间多于它在您的使用模式中节省的时间,则每次都动态地确定方法。
and the appearance of the code is unseemly.
然后不要直接使用反射,使用已经为您完成繁重工作的库。在这种情况下,您应该可以使用 dynamic
,它在幕后使用反射。
当然,隐藏反射的库很难优化反射的性能。您将不得不希望实施者做得足够好。但是你可以测量一下。
假设你有一个 class Foo
:
public class Foo
{
public static implicit operator Foo(string s)
{
return new Foo();
}
}
如果您尝试以通常的方式利用此运算符,它当然可以正常工作:
var s = "foo";
Foo foo = s;
但是如果您有操作数 (s
) 但您 仅 将其作为 object
:
object s = "foo";
Foo foo = s;
由于不存在从 object
到 Foo
的隐式转换,因此失败的原因很明显。但是,实例 是 和 string
并且类型转换运算符确实存在于这种情况下。出于这个问题的目的,假设所讨论的变量 (s
) 可以是多种类型中的任何一种,这些类型可能定义了类型转换运算符来执行请求的转换。
如果你愿意,你可以使用反射:
object s = "foo";
var converter = typeof(Foo)
.GetMethods()
.Single(x =>
x.Name == "op_Implicit" &&
x.ReturnType == typeof(Foo) &&
x.GetParameters().Single().ParameterType == typeof(string));
Foo foo = (Foo)converter.Invoke(null, new[] { s });
我尝试使用 Convert.ChangeType(s, typeof(Foo));
,但这不起作用。 有没有更好的选择或者使用反射是最好的选择?(出于标准原因,我对使用反射不满意——它可能没有最大限度地提高性能,而且代码的外观也不合时宜.但如果这是最好的选择,那很好。)
I'm unhappy with using reflection for the standard reasons -- it's probably not maximally performant
所需信息在 运行 时间之前根本不可用,因此您无法避免在 运行 时间确定该信息。这意味着反思。
您可以根据您的使用情况优化您的反射:如果您经常需要完全相同的转换,并且您需要转换的类型很少,您可以创建一个 Dictionary<Type, Func<object, Foo>>
。为特定类型创建一次DynamicMethod
,创建一个委托,并一遍又一遍地调用它。或者,如果动态方法的设置增加的时间多于它在您的使用模式中节省的时间,则每次都动态地确定方法。
and the appearance of the code is unseemly.
然后不要直接使用反射,使用已经为您完成繁重工作的库。在这种情况下,您应该可以使用 dynamic
,它在幕后使用反射。
当然,隐藏反射的库很难优化反射的性能。您将不得不希望实施者做得足够好。但是你可以测量一下。