更好的方法来定义静态方法

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实例,但仍然是一个实例.

Ran*_*dom 0

我通过在继承链中实现另一个级别来完成我需要的事情。

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。