标签: generic-constraints

通用约束:强制类型具有静态函数和带参数的构造函数

我知道你可以写:

class GenericClass<T> where T : new()
{ 

}
Run Code Online (Sandbox Code Playgroud)

强制执行T具有空构造函数.

我的Qs是:

  1. 你能强制执行T具有特定类型参数的构造函数吗?喜欢:

    class SingletonFactoryWithEmptyConstructor<T> where T : new(int)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你能强制执行T有静态函数(比方说void F()),这样你就可以在泛型类中使用这个函数吗?喜欢 :

    class GenericClass<T> where T : void F()
    { 
       void G ()
       {
           T.F();
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我知道你可以指定T实现一个接口,但我不希望这样.我想指定它T有一个静态函数.

.net c# generics generic-constraints

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

C#将通用参数转换为接口

我需要帮助将通用的paremetrs转换为接口.

我有这样的预烘焙代码:

public interface InterFoo<T> {...}
public InterFoo<T> specialFoo<T>() where T : InterFoo<T> {...}
public InterFoo<T> regularFoo<T>() {...}
Run Code Online (Sandbox Code Playgroud)

我想实现这样的东西

public InterFoo<T> adaptiveFoo<T>()
{
    if (T is InterFoo<T>)
        return specialFoo<T as InterFoo>();
    return regularFoo<T>();
}
Run Code Online (Sandbox Code Playgroud)

在这一点上,我无法找到任何解决方案,所以任何事情都会有所帮助,谢谢.

编辑:最初函数返回了一个int但是有一个更简单的解决方案与代码的预期目的不兼容,函数已被更改为请求泛型类型.

c# generics types casting generic-constraints

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

F#:成员约束有助于创建看似动态的类型

我一直在寻找一种方法来为F#方法添加一些鸭子类型.

SomeMethod(model:'a) =
   let someField = model.Test("")
Run Code Online (Sandbox Code Playgroud)

进来的参数有Test方法.我看过这样的符号:

member inline public x.Testing< ^a when ^a : (member public Test : String-> String)>(model:^a) =   
  let something = model.Test("")
  ignore
Run Code Online (Sandbox Code Playgroud)

对我来说,通用约束可以用于方法级别而不是类/接口级别.问题是由于类型问题我无法编译它.这让我相信没有办法在方法级别指定约束.这是coorect?

generics f# generic-constraints

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

如何约束泛型方法的嵌套泛型类型

我正在尝试创建一个方法,该方法根据给定的泛型类型从数据库返回数据。

接口:(此定义编译)

public interface IOrderPosition<TOrder, TArticle, TOrderPosition>
  where TOrder : IOrder
  where TArtile : IArticle
  where TOrderPosition : IOrderPosition<TOrder, TArticle, TOrderPosition>
{
  long? id { get; set; }
  TOrder order { get; set; }
  TArtile article { get; set; }
  List<TOrderPosition> subPositions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一个可能的具体实现:(这个定义编译)

public class OrderPosition : IOrderPosition<Order, Article, OrderPosition>
{
  public long? id { get; set; }
  public Order order { get; set; }
  public Article article { get; set; }
  public …
Run Code Online (Sandbox Code Playgroud)

c# generics nested-generics generic-constraints

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

C#裸型约束

在"C#6.0 in a Nutshell"中有一个裸体类型constarint用法的例子:

class Stack<T>
{
  Stack<U> FilteredStack<U>() where U : T {...}
}
Run Code Online (Sandbox Code Playgroud)

老实说,我不明白为什么我应该在这里使用这个约束.如果我将其删除并将U更改为T,结果将是相同的.那有什么意义呢?

谢谢.

c# generics generic-constraints

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

枚举在通用约束中

我为Enums(Enumerations)构建了一个扩展方法 - 请说出来 GetEnumSecondName

static string GetEnumSecondName(this Enum myEnumInstance)    {...}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个通用方法,它应该采用Enumeration并返回该类型的所有第二个名称.

List<string> GetSecondNames<T : ?T:Enum ? >()
{ 
  // ...

  foreach T member in GetAllMembers<T>()
    // should work only for Enum instances
    resultList.Add(member.GetEnumSecondName()); 

  // ...
}
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?

编辑:

据我所知(感谢Jon Skeet),C#不支持这种约束.如果有任何VB.NET专家确认"普通"VB.NET也不支持它.谢谢.

.net generics generic-constraints

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

C#generic constraint:Structs数组

我想创建一个通用约束,其中包含类型为值类型(结构)的数组,类似于:

public class X<T> where T : struct[]
Run Code Online (Sandbox Code Playgroud)

或者可能

public class X<T, U>
    where U : struct
    where T : U[]
Run Code Online (Sandbox Code Playgroud)

但这不起作用.似乎System.Array不能用作类型约束.

那么 - 如何将泛型参数约束为结构数组?

第一个回答后更新:

public interface IDeepCopyable<T>
{
    T DeepCopy(T t);
}


public class DeepCopyArrayOfValueTypes<T> : IDeepCopyable<T>
    where T : is an array of value types
{
    T Copy(T t) {...}
}
Run Code Online (Sandbox Code Playgroud)

c# arrays generics value-type generic-constraints

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

类级别的结构和字符串通用约束

您好,是否有任何解决方法可以创建一个同时具有结构和字符串作为通用约束的类?

public class AutoEncryptor<T> where T : struct, string {
{
      private T? _value;

      // codes removed for brevity
}
Run Code Online (Sandbox Code Playgroud)

我的目标是让自己免于创建具有相同结构的重复方法的麻烦,但区别在于,另一个接受字符串,另一个接受结构(值类型)。

c# generics constraints generic-constraints

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

通过特定的where子句在C#中创建泛型方法

我想创建一些通用方法,如下面的代码:

public async Task<T> Get<T>(string url) where T : IBaseModel, IList<IBaseModel>
Run Code Online (Sandbox Code Playgroud)

显然我想支持可枚举的集合以及从IBaseModel界面驱动的单个对象.方法定义没问题,但是当涉及到它的用法时,我会得到以下错误:

await myClass.Get<List<DrivedClassFromBaseModel>>("some url");

There is no implicit conversion from "System.Collection.Generic.List<DrivedClassFromBaseModel> to System.Collection.Generic.IList<IBaseModel>"
Run Code Online (Sandbox Code Playgroud)

.net c# generics generic-collections generic-constraints

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

列表和集合的通用约束

我有一个通用方法,看起来像这样:

public int GetCount<T>(T collection) where T: ICollection
{
   return collection.Count;    
}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够调用此方法,其中集合参数可以是 aList<T>或 a HashSet<T>。当前的代码无法满足这一要求,因为我想要传递的参数不继承该ICollection接口。现在有什么方法可以通过简单的约束来实现这一点吗?

c# generics constraints generic-constraints

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