基于属性值在c#中查找函数

基于属性值在c#中查找函数,c#,linq,reflection,C#,Linq,Reflection,我想通过一些适配器,基于属性值访问类的函数。所有功能都具有相同的原型 我认为这样做的方式是声明一本字典,如下所示: Dictionary<key_values, Delegate_of_Functions> 我的问题是: 如何得到未编译的行进行编译 有更好的方法吗 一种简单的方法是在找到的方法上调用。您可以在添加到词典中的匿名代理中执行此操作 您说所有函数都有相同的原型(在C#中通常称为签名),但由于您没有指出签名是什么,我将简单地假设一个void方法,它接受一个字符串和一个整数

我想通过一些适配器,基于属性值访问类的函数。所有功能都具有相同的原型
我认为这样做的方式是声明一本字典,如下所示:

Dictionary<key_values, Delegate_of_Functions>
我的问题是:

  • 如何得到未编译的行进行编译
  • 有更好的方法吗

一种简单的方法是在找到的方法上调用。您可以在添加到词典中的匿名代理中执行此操作

您说所有函数都有相同的原型(在C#中通常称为签名),但由于您没有指出签名是什么,我将简单地假设一个void方法,它接受一个字符串和一个整数(在下面的示例代码中由
操作
表示)。我相信您可以更改代码,使其适合您:-)

a
中的每个元素,即
foreach
循环中的每个
c
,都属于以下类型:

var Function=newdictionary();
//您的代码用于发现合适的函数并填充
foreach(a中的var c){
函数.Add(c.GetCustomAttributes(true).OfType().First().key,
(s,i)=>{
c、 调用(null,新对象[]{s,i});
});
}

在向该字典添加任何内容之前,您可能需要检查
MethodInfo
实例是否指示该方法确实具有所需的签名。否则,可能会有人有意或无意地用该属性标记具有不同签名的方法,并且调用
Invoke
将失败。

假定
函数是委托

delegate void function();
var Functions = new Dictionary<string, function>();

var a = typeof(TheFunctionsContainer).GetMethods().Where(f => f.GetCustomAttributes(typeof(The_Attribute), true).Any());

foreach (var c in a)
{
    Functions.Add(
      c.GetCustomAttributes(true).OfType<The_Attribute>().First().key,
      (function)Delegate.CreateDelegate(typeof(function), c)); 
}
可以使用该方法创建委托

delegate void function();
var Functions = new Dictionary<string, function>();

var a = typeof(TheFunctionsContainer).GetMethods().Where(f => f.GetCustomAttributes(typeof(The_Attribute), true).Any());

foreach (var c in a)
{
    Functions.Add(
      c.GetCustomAttributes(true).OfType<The_Attribute>().First().key,
      (function)Delegate.CreateDelegate(typeof(function), c)); 
}

或者只需查看svicks comment:-)

所有函数是否具有相同的签名?
functions=newdictionary()这行代码是如何编译的?什么是
function
?@alexander是的,所有函数都是名称和主体的同一部分。@ZaidMasud
function
是在我的代码中声明的委托。它声明了可以引用我感兴趣的函数。看一下。这将在每次调用中使用反射,这可能非常慢。我认为反射应该只用于创建委托,而不是每次调用它。您也可以在实例方法上使用第一种方法,您只需添加
this
作为委托的第一个参数。因此,例如,如果有表示
string.Insert()
MethodInfo
,可以使用第二种方法将其转换为
Func
,或者使用第一种方法将其转换为
Func
(function)Delegate.CreateDelegate(typeof(function), yourInstance, c)