Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问对象函数的属性<;S、 T>;_C# - Fatal编程技术网

C# 访问对象函数的属性<;S、 T>;

C# 访问对象函数的属性<;S、 T>;,c#,C#,我不知道Func的全部操作,所以也许我的问题对你们中的一些人来说很简单或显而易见 我有一个函数的以下标题: private static T MyMethod<S, T>(Func<S, T> testFunc) where S : class, new() { //Code.... } private static T MyMethod(Func testFunc),其中S:class,new() { //代码。。。。 } 我想从S对象访问属性。可能吗 例如:

我不知道
Func
的全部操作,所以也许我的问题对你们中的一些人来说很简单或显而易见

我有一个函数的以下标题:

private static T MyMethod<S, T>(Func<S, T> testFunc) where S : class, new()
{
   //Code....
}
private static T MyMethod(Func testFunc),其中S:class,new()
{
//代码。。。。
}
我想从
S
对象访问属性。可能吗

例如:
S.name

对不起,我的英语不好。

你能写:

private static T MyMethod<S, T>(Func<S, T> testFunc) where S : S, new()
{
   //Code....
}
private static T MyMethod(Func testFunc),其中S:S,new()
{
//代码。。。。
}
你是哪一类人?或者您的抽象类类型,其中您已经有一些公共属性了?

您可以写:

private static T MyMethod<S, T>(Func<S, T> testFunc) where S : S, new()
{
   //Code....
}
private static T MyMethod(Func testFunc),其中S:S,new()
{
//代码。。。。
}

你是哪一类人?或者您的抽象类类型已经有了一些公共属性?

您的方法所知道的关于
S
的所有信息都是,它是一个类,可以实例化。它不知道是否有名为
name
的属性。您可能需要要求该参数从具有预期属性的接口或类继承


您还可以尝试强制转换为已知类型,了解如果对象不是该类型,强制转换可能会失败。

您的方法对
S
的所有了解都是它是一个类,可以实例化。它不知道是否有名为
name
的属性。您可能需要要求该参数从具有预期属性的接口或类继承


您还可以尝试强制转换为已知类型,了解如果对象不是该类型,强制转换可能会失败。

首先,您应该知道,在您的方法中,您没有
对象。您有一个函数,它接受
S
并返回
T
。在本例中,我假设您的方法负责生成
S
实例,并将它们作为参数传递给
testFunc

但是,您可以使用反射来访问
S
的类型信息:

private static T MyMethod<S, T>(Func<S, T> testFunc) where S : class, new()
{
   var typeofS = typeof(S);

   var s = new S();
   var defaultName = (string)(typeofS.GetProperty("Name").GetValue(s, null));
}
private static T MyMethod(Func testFunc),其中S:class,new()
{
var typeofS=typeof(S);
var s=新的s();
var defaultName=(字符串)(typeofS.GetProperty(“Name”).GetValue(s,null));
}

(我希望这是显而易见的,但是,如果您得到的
S
没有
Name
属性,反射将失败;生产代码当然应该做更多的
null
检查、异常处理等)

首先,您应该知道,在您的方法中,没有
S
对象。您有一个函数,它接受
S
并返回
T
。在本例中,我假设您的方法负责生成
S
实例,并将它们作为参数传递给
testFunc

但是,您可以使用反射来访问
S
的类型信息:

private static T MyMethod<S, T>(Func<S, T> testFunc) where S : class, new()
{
   var typeofS = typeof(S);

   var s = new S();
   var defaultName = (string)(typeofS.GetProperty("Name").GetValue(s, null));
}
private static T MyMethod(Func testFunc),其中S:class,new()
{
var typeofS=typeof(S);
var s=新的s();
var defaultName=(字符串)(typeofS.GetProperty(“Name”).GetValue(s,null));
}


(我希望这是显而易见的,但是,如果您得到的
S
没有
Name
属性,反射将失败;生产代码当然应该做更多的
null
检查、异常处理等)

您不能为
S
使用接口吗?然后您将执行
其中的S:IMyInterface
。如果您这样做,您将能够访问
IMyInterface
@Claudio Redi上定义的
S
属性。如果您不使用接口,这是不可能的吗?如果我使用接口,该方法将保持耦合,而不是我想要的:(听起来你想从
MyMethod
内部访问
S
类型的任何对象,该对象将被放入
testFunc
(从任何其他位置)。也就是说(据我所知)不可能,也不应该如何使用。你不能为
S
使用接口吗?那么你可以在
中使用S:IMyInterface
。如果你这样做,你将能够访问
IMyInterface
@Claudio Redi上定义的
S
属性,如果你不使用接口,这是不可能的吗?如果我使用In面对面,该方法将保持耦合,而不是我想要的:(听起来你想从
MyMethod
内部访问
MyMethod
类型的任何对象,该对象将被放入
testFunc
(从任何其他位置)。也就是说(据我所知)不可能,也不是应该如何使用。S是一个对象,但没有基类,该对象有不同的属性,我需要访问所有…我解释一下?它将始终是同一个类?如果是,您可以用以下内容替换代码:
private static T MyMethod(Func etstFunc)
我想避免耦合方法…我在另一个项目中使用了它…tnksYou可以有一个公共抽象类,它将在不同的子类之间共享相同的属性。如果您想在方法的内容中使用它们…强制转换/反射不是一个合适的解决方案。(它会起作用,但不是更好的…)S是一个对象,但没有基类,该对象有不同的属性,我需要访问所有…我解释一下?它将始终是同一个类?如果是,您可以用以下内容替换代码:
private static T MyMethod(Func etstFunc)
我想避免耦合方法…我在另一个项目中使用了它…tnksYou可以有一个公共抽象类,它将在不同的子类之间共享相同的属性。如果您想在方法的内容中使用它们…强制转换/反射不是一个合适的解决方案。(它会起作用,但不是更好的…)非常感谢,我会试试这个。非常感谢,我会试试这个