Ran*_*dom 5 c# generics lambda extension-methods static
我面临着在我的基类上创建一个静态方法的要求,但不喜欢我必须声明类型参数,所以我想知道我是否正确地采用这种方式.
基本上,我正在分配我将与课堂上的属性相关联的代表.我可以轻松地将该方法放在继承的类上,如下所示:
public class Foo
{
public string Property1 { get; set; }
}
public class InheritsFoo : Foo
{
public void AssignDel<TVal>(
Expression<Func<InheritsFoo, TVal>> expr,
Action<InheritsFoo, TVal> action)
{
}
}
Run Code Online (Sandbox Code Playgroud)
或者,在扩展类中,我可以这样做:
public static void AssignDel<T, TVal>(
this T source,
Expression<T, TVal>> expression,
Action<T, TVal> action)
where T : Foo
{
}
Run Code Online (Sandbox Code Playgroud)
这两个都可以让我AssignDel在实例化的类中使用:
var foo = new InheritsFoo();
foo.AssignDel(x => x.Property1, handler);
Run Code Online (Sandbox Code Playgroud)
但我要求制作AssignDel静态.这使得扩展方式无用.它仍然有效InheritsFoo,但我真的想把它移到基类.如果我尝试,无法推断泛型参数,我必须更改方法的用法:
InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler);
Run Code Online (Sandbox Code Playgroud)
有没有办法在这里,另一种方式这样做我没有想到?
编辑:在关于扩展方法是否应该工作的评论中解决问题...我去了@Mark M.引用的网址.如果我这样写的话......
InheritsFoo foo = null;
foo.AssignDel(x => x.Property1, handler);
Run Code Online (Sandbox Code Playgroud)
编译(不知道它是否会运行).不过,不要认为这有资格使用静态方法,因为'foo'仍然被认为是一个实例; 一个null实例,但仍然是一个实例.
我通过在继承链中实现另一个级别来完成我需要的事情。
public class Foo
{
public string Property1 { get; set; }
}
public class Foo<T> : Foo
{
public static void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action)
{ }
}
public class InheritsFoo : Foo<InheritsFoo>
{ }
Run Code Online (Sandbox Code Playgroud)
我可以根据需要对待 InheritsFoo。
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |