我面臨一個要求,我的基類上創建一個靜態方法,但不喜歡我必須聲明類型參數,所以我想知道如果我去這個正確的方式。更好的方法來定義靜態方法
基本上,我指派的代表將與該類的屬性相關聯。我可以很容易地把方法上的繼承類,像這樣:
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)
{
}
}
或者,在擴展類,我可以這樣做:
public static void AssignDel<T, TVal>(
this T source,
Expression<T, TVal>> expression,
Action<T, TVal> action)
where T : Foo
{
}
這兩種將使我能夠使用AssignDel
在一個實例化類:
var foo = new InheritsFoo();
foo.AssignDel(x => x.Property1, handler);
但是我有一個要求,使AssignDel
靜態的。這使得它無用的擴展方式。它仍然在InheritsFoo
,但我真的想把它移到基類。如果我試試,泛型參數不能推斷,我不得不改變方法的用法:
InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler);
有沒有辦法在這裏,這樣我都沒有想到的另一種方式?
編輯:解決該問題的意見關於是否擴展方法會/應該工作......我去了@馬克引用的網址。結果是,如果我這樣寫......
InheritsFoo foo = null;
foo.AssignDel(x => x.Property1, handler);
編譯(不知道它是否會運行,雖然)。不過,不要認爲這符合使用靜態方法,因爲'foo'仍然被視爲一個實例;儘管如此,仍然是一個空實例,但是是一個實例。
擴展方法已經是靜態的。如何使靜態方法的要求妨礙使用擴展方法? –
「我有要求使'AssignDel'靜態」。然後使其成爲靜態。 –
@Kirk:儘管擴展方法被定義爲靜態方法,但它們只能用作預期類的實例方法。 –