C# C:Func用于泛型方法

C# C:Func用于泛型方法,c#,.net,generics,C#,.net,Generics,可以创建引用泛型方法的方法?像LINQ: 像这样的 Func myFunc=c=>c.HasValue?c、 ToString:null 成功编译后,您可以将任何函数分配给接收可空值并返回字符串的函数。是的,这是可能的,但您需要指定类型参数 func<int> f = myClass.returnsT<int>; 在哪里 class myClass { T returnsT<T>() {...} } 如果没有类型参数,它将无法工作我做了如下操作

可以创建引用泛型方法的方法?像LINQ:

像这样的

Func myFunc=c=>c.HasValue?c、 ToString:null


成功编译后,您可以将任何函数分配给接收可空值并返回字符串的函数。

是的,这是可能的,但您需要指定类型参数

func<int> f = myClass.returnsT<int>;
在哪里

class myClass
{
   T returnsT<T>()
   {...}
}

如果没有类型参数,它将无法工作

我做了如下操作:

func<int> f = myClass.returnsT<int>;
public static class Helper{

public static IEnumerable<KeyValuePair<string, string>> ToPairs(this NameValueCollection Form)
        {
            return Form.AllKeys.Cast<string>()
                .Select(key => new KeyValuePair<string, string>(key, Form[key]));
        }
}
Func<T> getDefault<T> = () => default(T);

如果此方法已成为C web开发中request.form的扩展方法。

如果我理解正确,您会问是否可以从匿名方法中引用泛型方法

答案是肯定的

例如,假设您需要一个Func,它以与OrderBy完全相同的排序顺序返回IEnumerable对象的元素。您可以这样做:

Func<IEnumerable<int>, Func<int, int>, IOrderedEnumerable<int>> orderByFunc =
    System.Linq.Enumerable.OrderBy<int, int>;
输出:

1
2
3
4
5
6
7
8
9
另一方面,如果您询问是否可以创建一个通用匿名方法,如下所示:

public static class Helper{

public static IEnumerable<KeyValuePair<string, string>> ToPairs(this NameValueCollection Form)
        {
            return Form.AllKeys.Cast<string>()
                .Select(key => new KeyValuePair<string, string>(key, Form[key]));
        }
}
Func<T> getDefault<T> = () => default(T);

这取决于你的背景。这可以在T已经声明为泛型类型参数的上下文中完成,即在泛型类或泛型方法中。见Freddy Rios的答案。不幸的是,在这样的上下文之外,它是非法的。

是的,但这取决于上下文-如果您已经在使用泛型,只需在上下文中使用T/如果没有,那么您已经知道特定的类型。在后面的例子中,如果您需要在一个方法上重用一点逻辑,那么您可能已经从将其移动到一个方法中获益了,所以只需像下面的第二个示例那样

2个样本:

public T Something<T>() {
    Func<T> someFunc = () => { return default(T); };
    return someFunc();
}

public Func<T> GetDefaultCreator<T>() {
    return () => { return default(T); };
}

我想我明白了:给定函数static TResult DoSomeStuffT obj,您能否创建一个Func,使其引用上面的函数,而在创建对该函数的引用时不提供类型参数。 我想这可能行得通欢迎你来测试,我现在附近没有C:


另外,在OrderBy中,它实际上不是一般委托。这是一个变量的声明。当函数被赋予时,将从中推断出类型。

Hi CubanX!,不是真的。您正在引用一个lambda,它接受一个可为null的对象并返回一个字符串。我试图引用一个接收类型TSource的泛型方法,例如,非常感谢!嗨,阿恩,谢谢你的回答。尽管如此,这并不是一种通用的方法。再次感谢你,谢谢你,丹!回答得好+1。您的意思是无法定义泛型Func对象?:O@SDReyes:这取决于您是否在范围内定义了T。也就是说,例如,如果您在泛型类中工作,那么在该类中的方法中,您可能可以声明Func。您也可以在泛型方法中执行此操作。但是,在一个非泛型的上下文中声明一个泛型匿名方法,例如,从属于某个非泛型类的任何普通的非泛型方法中声明一个泛型匿名方法,恐怕是不可能的?我认为从描述中你想要实现什么并不十分清楚。