当在编译时未知类型参数但是在运行时动态获取时,调用泛型方法的最佳方法是什么?
考虑以下示例代码 - 在Example()方法内部,GenericMethod<T>()使用Type存储在myType变量中调用的最简洁方法是什么?
public class Sample
{
public void Example(string typeName)
{
Type myType = FindType(typeName);
// What goes here to call GenericMethod<T>()?
GenericMethod<myType>(); // This doesn't work
// What changes to call StaticMethod<T>()?
Sample.StaticMethod<myType>(); // This also doesn't work
}
public void GenericMethod<T>()
{
// ...
}
public static void StaticMethod<T>()
{
//...
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试以下设计但没有成功:
abstract class Foo<T>
{
abstract T Output { get; }
}
class Bar
{
List<Foo> Foos;
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢使用数组列表,因为我必须使用不安全的转换来获取类型.我想要输入Foo,以便"输出"不仅仅是一个对象,在这种情况下我也必须使用不安全的强制转换.
正如我的代码目前,我使用Foo无类型输出作为对象.
但是,我想要一个泛型方法来接受所有实现相同接口的对象List.
此代码给出了没有隐式引用转换的错误.
public interface ITest { }
public class InterfaceUser : ITest { }
public class TestClass
{
void genericMethod<T>(T myList) where T : List<ITest> { }
void testGeneric()
{
genericMethod(new List<InterfaceUser>());
}
}
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
能否请你澄清这里提出的问题.
为什么最初定义的类很重要:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Run Code Online (Sandbox Code Playgroud)
感谢和问候,米兰.
我上课了
public class Setting<T>
{
public string name { get; set; }
public T value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个IList<Setting<T>>但是有不同类型Setting<T>的T,我想要eG
List<Setting<T>> settingsList;
settingsList.Add(new Setting<int>());
settingsList.Add(new Setting<string>());
Run Code Online (Sandbox Code Playgroud)
我试过IList<Setting<T>>但这似乎不可能,因为编译器找不到Type T.
我知道我可以使用对象,但我希望它是强类型的.所以我的问题是,是否有可能让这个工作.
我正在尝试访问子类中的泛型类型属性.在下面的例子中,我重新创建了我的问题.是否有解决此问题的方法,或者根本不可能?提前致谢!
编辑:无法将集合声明为A<Model>或A<T>.
public abstract class Model {
public int Id { get; }
}
public interface I<T> where T: Model {
ICollection<T> Results { get; }
}
public abstract class A { }
public class A<T> : A, I<T> where T : Model {
public ICollection<T> Results { get; }
}
public class Example {
A[] col;
void AddSomeModels() {
col = new A[] {
new A<SomeModel>(),
new A<SomeOtherModel>()
}
}
void DoSomethingWithCollection() {
foreach (var …Run Code Online (Sandbox Code Playgroud) 我有以下行动:
abstract class AAction
{}
class BlueAction: AAction
{
void Foo1(){// do stuff}
void Foo2(){// do stuff}
}
Run Code Online (Sandbox Code Playgroud)
以及应包含操作的插件:
class APlugin
{
AAction _action;
APlugin(AAction action)
{
_action = action;
}
}
class BluePlugin: APlugin
{
BluePlugin(): base(new BlueAction());
{
}
voif Foo()
{
// do stuff with BlueAction's methods
((BlueAction)_action).Foo1();
((BlueAction)_action).Foo2();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图将这种设计融入设计模式,没有运气.
我只想要强制派生类APlugin来拥有一个AAction
我可以做到这一点:
BlueAction act = (BlueAction)_action;
act.Foo1();
act.Foo2();
Run Code Online (Sandbox Code Playgroud)
使用泛型(如建议)不允许我有一个APlugins列表,这是我真正需要的.
但这对我来说是不行的.有任何想法吗?
如何将变量的类型放在方法参数中,因为某个类是由类变量定义的?例如:
class MyClass {
private Type _type;
public MyClass(Type type) {
_type = type;
}
public void SomeMethod(_type param) { //... }
public _type OtherMethod() {}
}
Run Code Online (Sandbox Code Playgroud)
因此,我的想法是,我可以将动态类型设置为类中的变量,并将该Type变量用作其他对象的类型.
是否可以在C#中执行此操作?
编辑:
我决定让我的问题更清楚,并解释我为什么要求这样的功能.我试过Generics.然而,泛型的问题是,每次我引用该类的对象时,我必须声明类的类型,如:MyClass<TSomeType> param
在我的场景中,我有一个List<MyClass> dataList包含MyClass.如果我在MyClass上有一个泛型,那么dataList必须是List<MyClass<TSomeType>>.在这种情况下,我被卡住了,因为列表只能包含MyClass<TSomeType>.一旦我宣布了全班的类型,我就不能拥有其他类型的类型.这就是为什么我想知道是否有一种更传统的方式来声明一个Type,就像我可以将一个类的类型存储到一个变量,然后像类类型一样使用这个变量.
在我的wpf应用程序中,主视图有5个选项卡,有5个不同的用户控件,因为用户控件彼此不相关,我创建了5个不同的视图模型(除了主视图模型).
我想有一个List或字典来获取usercontrols及其viewmodel列表,现在,我想将tabitems与usercontrols列表绑定并分配datacontexts,但由于列表或字典可以更改,我找不到一种将用户控件绑定到tabitems的方法.
例如,如果我有一个标签,它将与我可以分配的用户控件相关联
tab1View tview=new tab1View();
tview.DataContext= new tab1ViewModel();
tab1.Content=tview;
Run Code Online (Sandbox Code Playgroud)
但是,如何从具有usercontrols视图和视图模型的引用的列表中执行相同操作?
请教我一个实现这个目标的最佳方法.
**答案:**
我得到了我需要的答案.首先,应创建视图模型的通用类型集合 C# - 一个列表中的多个泛型类型
public abstract class Metadata
{
}
public class Metadata<DataType> : MetaData where DataType : class
{
private DataType mDataType;
}
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<tab1ViewModel>());
metadataObjects.Add(new Metadata<tab2ViewModel>());
Run Code Online (Sandbox Code Playgroud)
如果要使用相同的viewmodel引用多个视图,则创建一个DataTemplate选择器,或者只应用DataTemplate
c# ×9
generics ×6
.net ×2
inheritance ×2
collections ×1
data-binding ×1
list ×1
mvvm ×1
reflection ×1
types ×1
wpf ×1