相关疑难解决方法(0)

如何使用反射来调用泛型方法?

当在编译时未知类型参数但是在运行时动态获取时,调用泛型方法的最佳方法是什么?

考虑以下示例代码 - 在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)

c# generics reflection

1002
推荐指数
6
解决办法
24万
查看次数

是否可以在C#中使用无类型泛型列表?

我正在尝试以下设计但没有成功:

abstract class Foo<T>
{
    abstract T Output { get; }
}

class Bar
{
    List<Foo> Foos;
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢使用数组列表,因为我必须使用不安全的转换来获取类型.我想要输入Foo,以便"输​​出"不仅仅是一个对象,在这种情况下我也必须使用不安全的强制转换.

正如我的代码目前,我使用Foo无类型输出作为对象.

c# generics list

6
推荐指数
1
解决办法
2581
查看次数

通用方法,其中T是实现接口的List

这类似于C# - 一个列表中的多个泛型类型

但是,我想要一个泛型方法来接受所有实现相同接口的对象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)

可以这样做吗?

c# generics

5
推荐指数
1
解决办法
7506
查看次数

C# - 一个列表中的多个泛型类型II

能否请你澄清这里提出的问题.

为什么最初定义的类很重要:

public class Metadata<DataType> where DataType : struct 
{ 
   private DataType mDataType; 
}
Run Code Online (Sandbox Code Playgroud)
  1. 被替换为从相同接口或抽象类派生的可能是因为IList <>成员必须共享一些常见的对象类型?
  2. 必须使该公共类型与IList <>类型具有相同的名称,例如.IList - >派生自T,或IList - >派生自InterfaceT,IT?

感谢和问候,米兰.

.net c# generics types

4
推荐指数
1
解决办法
2310
查看次数

我可以创建List <Class <T >>吗?

我上课了

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.

我知道我可以使用对象,但我希望它是强类型的.所以我的问题是,是否有可能让这个工作.

.net c# generics

4
推荐指数
1
解决办法
5703
查看次数

C# - 继承类的Access属性

我正在尝试访问子类中的泛型类型属性.在下面的例子中,我重新创建了我的问题.是否有解决此问题的方法,或者根本不可能?提前致谢!

编辑:无法将集合声明为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)

c# generics collections inheritance

4
推荐指数
1
解决办法
60
查看次数

如何在这种情况下停止投射?

我有以下行动:

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列表,这是我真正需要的.

但这对我来说是不行的.有任何想法吗?

c# inheritance design-patterns

3
推荐指数
1
解决办法
149
查看次数

从Type的变量中声明参数的类型?

如何将变量的类型放在方法参数中,因为某个类是由类变量定义的?例如:

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,就像我可以将一个类的类型存储到一个变量,然后像类类型一样使用这个变量.

c#

2
推荐指数
1
解决办法
254
查看次数

MVVM用于基于tabcontrol的应用程序

在我的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# data-binding wpf mvvm

1
推荐指数
1
解决办法
2896
查看次数