C# 访问通用对象参数

C# 访问通用对象参数,c#,asp.net,asp.net-mvc,generics,C#,Asp.net,Asp.net Mvc,Generics,考虑以下代码段: public class FooRepository<T> : BaseRepository<T> where T : EntityBase { public FooRepository(ISessionFactory sessionFactory) : base(sessionFactory) { this.AfterWriteOperation += (sender, local) =>

考虑以下代码段:

public class FooRepository<T> : BaseRepository<T>
    where T : EntityBase
{
    public FooRepository(ISessionFactory sessionFactory)
        : base(sessionFactory)
    {
        this.AfterWriteOperation += (sender, local) => this.Log();
    }

    public void Log()
    {
        // I want to access T here
    }
}
Update
方法中,调用事件
AfterWriteOperation

if (AfterWriteOperation != null)
    AfterWriteOperation(this, e);
有了所有这些,我就忽略了一个简单的事实,即在上述情况下,
e
是我的实体,因此我可以通过以下方式将其传递给日志:

(sender, local) => this.Log(local); // I will rename local to entity

如果您想获取有关类型的信息,例如
名称
方法
接口
,那么在
日志
中使用
类型(T
)-这与
.GetType()
调用实例类似,并将返回泛型参数的类型。 如果要使用该类型的任何实例,必须

a) 创建一个实例
(Activator.CreateInstance(typeof(T))


b) 通过构造函数将实例传递给
this.Log(passedInstance)
调用。

如果您想获取有关类型的信息,例如
名称
方法
接口
..
则在
日志
中使用
类型(T
)-这与
.GetType()类似
调用实例并返回泛型参数的类型。 如果要使用该类型的任何实例,必须

a) 创建一个实例
(Activator.CreateInstance(typeof(T))

b) 通过构造函数将实例传递给
this.Log(passedInstance)
调用

类似于
void Log(T entity)
并在方法内部使用它

:

使用系统;
命名空间工作4me
{
公共接口ISessionFactory{}
公共类EntityBase{}
公共类BaseRepository,其中T:EntityBase{}
公共类FooRepository:BaseRepository
其中T:EntityBase
{
公共FooRepository(ISessionFactory sessionFactory)
{
}
公共作废日志(T实体)
{
}
}
公开课考试
{
公共静态void Main()
{
//你的密码在这里
}
}
}
Success#stdin#stdout 0.01s 33480KB

关于你的其他声明:

我想访问
Log()
中的
T
实例

T
本身没有实例。您可以使用
typeof(T)
获得表示
T
Type
对象

类似于
void Log(T entity)
并在方法内部使用它

:

使用系统;
命名空间工作4me
{
公共接口ISessionFactory{}
公共类EntityBase{}
公共类BaseRepository,其中T:EntityBase{}
公共类FooRepository:BaseRepository
其中T:EntityBase
{
公共FooRepository(ISessionFactory sessionFactory)
{
}
公共作废日志(T实体)
{
}
}
公开课考试
{
公共静态void Main()
{
//你的密码在这里
}
}
}
Success#stdin#stdout 0.01s 33480KB

关于你的其他声明:

我想访问
Log()
中的
T
实例


T
本身没有实例。您可以使用
typeof(T)

获得表示
T
Type
对象访问
T
意味着什么<代码>类型(T)?否则只需使用它。…。@ta.speot.就像
void Log(T entity)
一样,并在方法内部使用它。那么,写下它吧?为什么这不是一个选择?您是否尝试过这样声明
Log
?取一个
T
?@LasseV.Karlsen类型的参数,你的意思是只使用它?当我尝试获取时,
类型参数名称此时无效
@LasseV.Karlsen我不知道如何在构造函数内部访问它以将其传递给
Log()
。访问
t
意味着什么<代码>类型(T)?否则只需使用它。…。@ta.speot.就像
void Log(T entity)
一样,并在方法内部使用它。那么,写下它吧?为什么这不是一个选择?您是否尝试过这样声明
Log
?取一个
T
?@LasseV.Karlsen类型的参数,你的意思是只使用它?当我尝试获取时,
类型参数名称此时无效
@LasseV.Karlsen我不知道如何在构造函数中访问它以将其传递给
Log()
。奇怪的是,它部分工作。我得到了带有b选项的实例,但是is的所有属性都是
null
值。而您传递的实例在这些属性上都有值?我看不出有问题。您不能在未定义的类中触发事件-实际上不需要该事件,因为日志也是同一类层次结构的一部分?对我来说,你的代码工作……奇怪的是,它部分工作。我得到了带有b选项的实例,但是is的所有属性都是
null
值。而您传递的实例在这些属性上都有值?我看不出有问题。您不能在未定义的类中触发事件-实际上不需要该事件,因为日志也是同一类层次结构的一部分?对我来说,你的代码很有效……好吧,现在我可以得到这个实例了,因为这一直都是我的错。谢谢你抽出时间。这个问题应该结束了。好吧,现在我可以得到这个例子了,因为这一直都是我的错。谢谢你抽出时间。这个问题应该结束了。
(sender, local) => this.Log(local); // I will rename local to entity
using System;

namespace Works4Me
{
    public interface ISessionFactory { }
    public class EntityBase { }
    public class BaseRepository<T> where T : EntityBase { }

    public class FooRepository<T> : BaseRepository<T>
        where T : EntityBase
    {
        public FooRepository(ISessionFactory sessionFactory)
        {
        }

        public void Log(T entity)
        {
        }
    }

    public class Test
    {
        public static void Main()
        {
        // your code goes here
        }
    }
}