我不認為我想做的事情是可能的;有沒有辦法真正做到這一點?
有一個Base類可以派生出各種不同的類。派生類可以是通用的,也可以不是;派生類的實體被添加到 in 型別的集合Base中WindowViewModel。Base 類有一組Options可供WindowViewModel.
問題是:IOption介面宣告了一個回傳型別,Func<object, bool> MyFunc但回傳型別MyFunc需要是Func<T, bool>泛型類方法RunIt()和賦值MyClass才能作業。我可以制作IOption泛型,但是Base該類需要是泛型的,然后WindowViewModel.ViewModels還需要以某種方式重新定義。我不想讓 Base 泛型,因為在那里引入泛型只會讓其他一切變得一團糟。
問題:是否有不同的方式來宣告MyFuncinIOption而不使用泛型來允許分配Func<T,bool>in MyClass?
public interface IOption
{
public string Description {get; set;}
public Expression<Func<object,bool>> MyFunc { get; set; }
}
public class Option : IOption
{
public string Description {get; set;}
public Expression<Func<object,bool>> MyFunc { get; set; }
}
public abstract class Base
{
public abstract ObservableCollection<Option> Options { get; set; }
public abstract Option SelectedOption { get; set; }
public abstract void RunIt();
}
public class Generic<T> : Base
{
private DBContext _context;
public override ObservableCollection<Option> Options { get; set; }
public override Option SelectedOption { get; set; }
public Generic()
: base()
{
Options = new ObservableCollection<Option>();
}
public override void RunIt()
{
var result = _context.Set<T>().Where(SelectedOption?.MyFunc);
// process result
}
}
public class MyClass : Generic<MyType>
{
public MyClass
: base()
{
Func<MyType,bool> expression = t => t.MyDescription = "Hello World";
Options.Add(new Option("Hi", expression)); // fail to compile type mismatch
SelectedOption = Options.First();
}
}
public class Special : Base
{
// do something else
}
public class WindowViewModel
{
public WindowViewModel ()
{
MyViewModels = new ObservableCollection<Base>();
MyViewModels.Add(new Special());
MyViewModels.Add(new MyClass());
}
public ObservableCollection<Base> MyViewModels {get; set;}
public Base SelectedViewModel { get; set; }
public void DoRunIt()
{
SelectedViewModel.RunIt();
}
}
我嘗試過的可以編譯但在使用時拋出運行時例外的一件事是
Func<MyType,bool> expression = t => t.MyDescription = "Hello World";
MyFunc = t => expression((MyType)t);
uj5u.com熱心網友回復:
有一種方法可以做到這一點。它使用將所有委托(Func<MyType, bool>是委托)強制轉換為的能力Delegate。
你會改變IOption這個Option:
public interface IOption
{
public string Description { get; set; }
Func<T, bool> GetMyFunc<T>();
}
public class Option : IOption
{
string description;
private Delegate expression;
public Option(string description, Delegate expression)
{
this.description = description;
this.expression = expression;
}
public string Description { get; set; }
public Func<T, bool> GetMyFunc<T>() => (Func<T, bool>)this.expression;
}
然后MyClass按預期作業(代碼中的其他語法錯誤除外)。
RunIt然后你只需要改變Generic<T>這個:
public override void RunIt()
{
var result = _context.Set<T>().Where(SelectedOption?.GetMyFunc<T>());
// process result
}
uj5u.com熱心網友回復:
問題:有沒有不同的方法在 IOption 中宣告 MyFunc 而不使用泛型來允許在 MyClass 中分配 Func<T,bool> ?
不,我不相信這是可能的。不過,您可以擁有非泛型型別的泛型方法。
但是,有一個選項可能對您有用。你說
我不想讓 Base 泛型,因為在那里引入泛型只會讓其他一切變得一團糟。
兩者兼得如何?
public abstract class Base<T>
{
public abstract ObservableCollection<Option<T>> Options { get; set; }
public abstract Option<T> SelectedOption { get; set; }
public abstract void RunIt();
}
public abstract class Base : Base<object> { }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426104.html
