为什么ICustomAttributeProvider.GetCustomAttributes()返回object[]而不是Attribute[]?
在使用ICustomAttributeProvidermscorlib 的实现时是否有任何情况,系统程序集将返回非类型的对象Attribute?
当C#编译器解释方法调用时,它必须使用(静态)参数类型来确定实际调用哪个重载.我希望能够以编程方式执行此操作.
如果我有一个方法(a string)的名称,声明它的类型(一个实例System.Type),以及一个参数类型列表,我希望能够调用标准库函数并获取一个MethodInfo表示C#方法的对象编译器会选择调用.
例如,如果我有
class MyClass {
public void myFunc(BaseClass bc) {};
public void myFunc(DerivedClass dc) {};
}
Run Code Online (Sandbox Code Playgroud)
然后,我想是这样的虚构功能GetOverloadedMethod上System.Type
MethodInfo methodToInvoke
= typeof(MyClass).GetOverloadedMethod("myFunc", new System.Type[] {typeof(BaseClass)});
Run Code Online (Sandbox Code Playgroud)
在这种情况下methodToInvoke应该是public void myFunc(BaseClass bc).
注:既不方法GetMethod和GetMethods将成为我的目的.他们都没有做任何重载决议.在GetMethod它的情况下它只返回完全匹配.如果你给它更多的派生参数,它将只返回任何东西.或者你可能有幸得到一个模糊性异常,它没有提供有用的信息.
c# reflection system.reflection overload-resolution system-codedom-compiler
我不知道我问的问题是否可用,但我只是想知道它是否存在以及它是如何工作的.所以这是我的问题:
我有自己的2-3个自定义模型类.例如,客户,员工和产品.现在我在一个字符串中有类名.并且基于字符串中的类名,我必须创建其对象并返回到VIEW.我怎么能实现这个目标?
我知道一个IF ELSE声明选项,但我想尝试更好的" 动态 "方式......
我遇到了下面给出的代码
Object oMissing = System.Reflection.Missing.Value
oDataDoc = wrdApp.Documents.Open(ref oName, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing);
Run Code Online (Sandbox Code Playgroud)
我不明白什么会反映出来.它会自动获得这样的价值观吗?
根据CLI标准(分区IIA,第19章)和System.Reflection.ExceptionHandlingClauseOptions枚举的MSDN参考页面,有四种不同的异常处理程序块:
鉴于这些简短的解释(引自CLI标准,顺便说一句),这些应该映射到C#,如下所示:
catch (FooException) { … }Catch FooException When booleanExpression)finally { … }catch { … }一个简单的实验表明,这种映射不是.NET的C#编译器真正做的事情:
// using System.Linq;
// using System.Reflection;
static bool IsCatchWithoutTypeSpecificationEmittedAsFaultClause()
{
try
{
return MethodBase
.GetCurrentMethod()
.GetMethodBody()
.ExceptionHandlingClauses
.Any(clause => clause.Flags == ExceptionHandlingClauseOptions.Fault);
}
catch // <-- this is what the above code …Run Code Online (Sandbox Code Playgroud) 我在.NET 4.5中有以下代码行,我试图构建为可移植类库.它的目的是获得汇编版本:
this.GetType().Assembly.GetName().Version.Major;
Run Code Online (Sandbox Code Playgroud)
问题是Assembly.GetName()在PCL中不可用.有没有办法在PCL中获得汇编版本?
我知道可以解析Assembly.FullName,但我想要一个更好的解决方案.
我收到类型的异常"Exception Details:System.Reflection.ReflectionTypeLoadException:无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息." 使用以下代码:
public IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true)
{
foreach(var a in assemblies)
{
foreach (var t in a.GetTypes())
Run Code Online (Sandbox Code Playgroud)
我需要获取每个程序集中定义的类型,但似乎无法生成它.
我已经通过删除dll,清理解决方案,重新加载解决方案等执行了与错误的程序集创建相关的所有典型过程,但没有发生任何事情.
我想请求想法,以通过找到一种方法来检索错误的更多信息,或者找到组件产生问题或类似的东西来解决这个问题.当前的异常消息是如此模糊以至于意识到哪个是问题.
非常感谢.ps:附加信息,当我运行重建操作时,所有进程都正确生成,没有错误.
我正在构建一个当前只有UI元素的WPF应用程序.我正在尝试通过导入dll来使用我在另一个项目中创建的一些类.当我运行wpf应用程序时,Visual Studio会在团队资源管理器中弹出此对话框:

应用程序仍然运行,但我不知道此错误的原因及其影响.有没有其他人遇到此错误并有一些见解?
不确定它是否相关,但我导入的项目是使用NHibernate和Log4Net.我也使用Visual Studio 2013 Express,如果它与它有任何关系.
更新:
这是堆栈跟踪:
at DatabaseUI.DatabaseViewModel..ctor() in c:\Users\andrew\Documents\Visual Studio 2013\Projects\DatabaseUI\DatabaseUI\ViewModels\DatabaseViewModel.cs:line 36
at DatabaseUI.MainWindow..ctor() in c:\Users\andrew\Documents\Visual Studio 2013\Projects\DatabaseUI\DatabaseUI\MainWindow.xaml.cs:line 30
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] …Run Code Online (Sandbox Code Playgroud) 我有一个我想用反射调用的私有静态泛型方法,但实际上我想在另一个方法中"捆绑"它.C#7.0支持本地功能,所以这绝对是可能的.
你会说"你为什么不直接叫它?" 但我正在用它来获得以强类型方式使用对象和System.Type的能力,所以我需要动态调用它.如果我将它作为自己的私有静态泛型方法,则此代码已经有效.
private static void HandleResponse(object data, Type asType)
{
var application = typeof(Program);
application
.GetMethod(nameof(UseAs), BindingFlags.Static | BindingFlags.NonPublic)
.MakeGenericMethod(asType)
.Invoke(null, new object[] { data });
}
public static void UseAs<T>(T obj)
{
Console.WriteLine($"Object is now a: {typeof(T)}:");
};
Run Code Online (Sandbox Code Playgroud)
上面的代码有效.如果我通过:
data: new TestObject(),
type: typeof(TestObject)
Run Code Online (Sandbox Code Playgroud)
我实际上在UseAs中有一个TestObject.
所以,我想把这一切都放在一个方法中,如下所示:
private static void HandleResponse(object data, Type asType)
{
void useAs<T>(T obj)
{
Console.WriteLine($"Object is now a: {typeof(T)}:");
};
var application = typeof(Program);
application
.GetMethod(nameof(UseAs), BindingFlags.Static | BindingFlags.NonPublic)
.MakeGenericMethod(asType)
.Invoke(null, new object[] { …Run Code Online (Sandbox Code Playgroud) 构造函数如下所示:
public NameAndValue(string name, string value)
Run Code Online (Sandbox Code Playgroud)
我需要使用Reflection将其作为MethodInfo.它尝试了以下方法,但它没有找到构造函数(GetMethod返回null).
MethodInfo constructor = typeof(NameAndValue).GetMethod(".ctor", new[] { typeof(string), typeof(string) });
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?