我使用的方法是第一个参数:
Action<IFieldsetter<Contact>>
我该怎么读?是否意味着这必须是一个Action对象,其中Action构造函数被约束为只接受实现IFieldsetter的东西?看起来IFieldsetter本身受到限制,但我根本不理解这一部分。
答案 0 :(得分:4)
它不是一个真正的约束,而只是它需要的类型。因此,该方法的第一个参数是Action
(即delegate
),它只有一个参数,并且该参数是IFieldsetter<Contact>
,无论这意味着什么。我的猜测是IFieldsetter
暴露了一个setter,在这种情况下它必须处理类型Contact
,但你应该是真正知道它们是什么和做什么的人!如果您需要进一步的帮助,请发布此接口的代码和此类。
例如,如果它是Action<IEnumerable<String>>
,则意味着委托接收字符串列表作为参数。这是一些代码:
// Your method with the *special* parameter.
private void ChrisMethod(Action<IEnumerable<String>> method)
{
string[] exampleList = { "First", "Second", "Third" };
method(exampleList);
}
// The method that can be used as parameter.
private void ParameterMethod(IEnumerable<String> list)
{
foreach(string str in list)
Console.WriteLine(str);
}
public void Main()
{
ChrisMethod(ParameterMethod);
}
对类型参数的约束是另一回事。您可以详细了解here。
答案 1 :(得分:1)
C#System.Action(MSDN)是一个委托对象,其中Action<T>
相当于与void FunctionName(T)
匹配的委托函数。所以你可以将它设置为一个函数,然后再调用该函数。
部分通用程序块<Contact>
适用于IFieldsetter
,因此您有一个采用IFieldsetter<Contact>
参数的Action。在不了解IFieldsetter的情况下,我无法告诉你它与那里的Contact泛型参数有什么关系。
为了使用它,你可以得到类似以下的东西:
void Main()
{
FunctionThatDoesStuff(SetField);
}
void FunctionThatDoesStuff(Action<IFieldsetter<Contact>> action)
{
var setter = new IFieldsetter<Contact>();
action(setter);
}
void SetField(IFieldsetter<Contact> setter)
{
}
答案 2 :(得分:1)
这是嵌套的泛型类型参数。从最外层,您可以看到这是Action<T>
委托。并且委托需要类型为T的参数。在这种情况下,T由IFieldsetter<Contact>
替换。即Action<IFieldSetter<Contact>>
需要IFieldSetter<Contact>
类型的参数。现在,IFieldSetter<T>
接口设置了T类型的字段。在这种情况下,T被Contact
替换,因此IFieldSetter<Contact>
设置了Contact
类型的字段。
总结一下: Action<IFieldsetter<Contact>>
代表一个Action
委托,需要IFieldSetter
类型的参数,可以设置Contact
类型的字段。现在你明白了吗?
答案 3 :(得分:0)
Action<IFieldsetter<Contact>>
表示Action委托接受实现通用接口IFieldsetter的类型参数。假设一个类是用IFieldsetter插入实现的,其中Contact作为通用参数,如下所示。
public class Test: IFieldsetter<Conatct>
{
}
现在,此测试类的实例可以作为参数传递给Action deletegate。